การใช้ BigQuery กับ Python

1. ภาพรวม

BigQuery คือคลังเก็บข้อมูลการวิเคราะห์ต้นทุนต่ำที่มีความจุระดับเพทาไบต์ที่ Google จัดการอย่างเต็มรูปแบบ BigQuery คือ NoOps ไม่มีโครงสร้างพื้นฐานให้จัดการและคุณไม่จำเป็นต้องมีผู้ดูแลระบบฐานข้อมูล คุณจึงสามารถมุ่งเน้นไปที่การวิเคราะห์ข้อมูลเพื่อค้นหาข้อมูลเชิงลึกที่มีความหมาย ใช้ SQL ที่คุ้นเคย และใช้ประโยชน์จากโมเดลแบบจ่ายเมื่อใช้

ใน Codelab นี้ คุณจะใช้ไลบรารีของไคลเอ็นต์ Google Cloud สำหรับ Python เพื่อค้นหาชุดข้อมูลสาธารณะของ BigQuery ด้วย Python

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้ Cloud Shell
  • วิธีเปิดใช้ BigQuery API
  • วิธีตรวจสอบสิทธิ์คำขอ API
  • วิธีติดตั้งไลบรารีของไคลเอ็นต์ Python
  • วิธีค้นหาผลงานของเชกสเปียร์
  • วิธีค้นหาชุดข้อมูล GitHub
  • วิธีปรับการแคชและการแสดงสถิติ

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • ความคุ้นเคยกับการใช้ Python

แบบสำรวจ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Python อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้และคุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ซึ่งปกติระบุไว้ว่าเป็น PROJECT_ID) ดังนั้นหากไม่ชอบ ให้สร้างรหัสแบบสุ่มขึ้นมาอีกรหัสหนึ่ง หรือคุณจะลองใช้รหัสโปรเจ็กต์ของคุณเองแล้วดูว่ารหัสโปรเจ็กต์พร้อมใช้งานหรือไม่ แล้วก็ "แช่แข็ง" หลังจากสร้างโปรเจ็กต์แล้ว
  • มีค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ให้ทำตาม "การล้าง" ดูได้ที่ตอนท้ายของ Codelab ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png จาก Cloud Console

55efc1aaa7a4d3ad.png

หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที

9f0e51b578fecce5.png

เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ Chromebook เท่านั้น

เมื่อเชื่อมต่อกับ Cloud Shell คุณควรเห็นว่าได้รับการตรวจสอบสิทธิ์แล้ว และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตจากคำสั่ง

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้เกี่ยวกับโปรเจ็กต์ของคุณ
gcloud config list project

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตจากคำสั่ง

Updated property [core/project].

3. เปิดใช้ API

ควรเปิดใช้ BigQuery API โดยค่าเริ่มต้นในโปรเจ็กต์ Google Cloud ทั้งหมด คุณตรวจสอบว่าเรื่องนี้เป็นจริงหรือไม่ได้ด้วยคำสั่งต่อไปนี้ใน Cloud Shell: คุณควรอยู่ในรายการ BigQuery

gcloud services list

คุณควรเห็น BigQuery แสดงอยู่

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

ในกรณีที่ไม่ได้เปิดใช้ BigQuery API คุณจะใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อเปิดใช้ได้

gcloud services enable bigquery.googleapis.com

4. ตรวจสอบสิทธิ์คำขอ API

คุณต้องใช้บัญชีบริการเพื่อส่งคำขอไปยัง BigQuery API บัญชีบริการเป็นของโปรเจ็กต์และไลบรารีไคลเอ็นต์ Google Cloud Python จะใช้บัญชีนี้เพื่อสร้างคำขอ API ของ BigQuery บัญชีบริการจะแสดงด้วยอีเมลเช่นเดียวกับบัญชีผู้ใช้อื่นๆ ในส่วนนี้ คุณจะใช้ Cloud SDK เพื่อสร้างบัญชีบริการ จากนั้นจึงสร้างข้อมูลเข้าสู่ระบบที่จะใช้ตรวจสอบสิทธิ์ว่าเป็นบัญชีบริการ

ก่อนอื่นให้ตั้งค่าตัวแปรสภาพแวดล้อม PROJECT_ID ดังนี้

export PROJECT_ID=$(gcloud config get-value core/project)

ถัดไป ให้สร้างบัญชีบริการใหม่เพื่อเข้าถึง BigQuery API โดยใช้สิ่งต่อไปนี้

gcloud iam service-accounts create my-bigquery-sa \
  --display-name "my bigquery service account"

จากนั้น สร้างข้อมูลเข้าสู่ระบบที่โค้ด Python จะใช้เพื่อเข้าสู่ระบบเป็นบัญชีบริการใหม่ สร้างข้อมูลเข้าสู่ระบบเหล่านี้และบันทึกเป็นไฟล์ JSON ~/key.json โดยใช้คำสั่งต่อไปนี้

gcloud iam service-accounts keys create ~/key.json \
  --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com

สุดท้าย ให้ตั้งค่าตัวแปรสภาพแวดล้อม GOOGLE_APPLICATION_CREDENTIALS ที่ไลบรารีของไคลเอ็นต์ BigQuery Python ใช้ ซึ่งจะกล่าวถึงในขั้นตอนถัดไปเพื่อค้นหาข้อมูลเข้าสู่ระบบ ควรตั้งค่าตัวแปรสภาพแวดล้อมเป็นเส้นทางแบบเต็มของไฟล์ JSON ของข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้น โดยใช้สิ่งต่อไปนี้

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

อ่านเพิ่มเติมเกี่ยวกับการตรวจสอบสิทธิ์ BigQuery API

5. ตั้งค่าการควบคุมการเข้าถึง

BigQuery ใช้ Identity and Access Management (IAM) เพื่อจัดการการเข้าถึงทรัพยากร BigQuery มีบทบาทที่กำหนดไว้ล่วงหน้าจำนวนหนึ่ง (ผู้ใช้, dataOwner, dataViewer เป็นต้น) ซึ่งคุณกําหนดให้กับบัญชีบริการที่คุณสร้างขึ้นในขั้นตอนก่อนหน้าได้ อ่านเพิ่มเติมเกี่ยวกับการควบคุมการเข้าถึงได้ในเอกสาร BigQuery

ก่อนที่จะค้นหาชุดข้อมูลสาธารณะได้ คุณต้องตรวจสอบว่าบัญชีบริการมีบทบาท roles/bigquery.user เป็นอย่างน้อย เรียกใช้คำสั่งต่อไปนี้เพื่อมอบหมายบทบาทผู้ใช้ให้กับบัญชีบริการใน Cloud Shell

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/bigquery.user"

คุณเรียกใช้คำสั่งต่อไปนี้เพื่อยืนยันว่าบัญชีบริการมีบทบาทของผู้ใช้ได้

gcloud projects get-iam-policy $PROJECT_ID

คุณควรจะเห็นสิ่งต่อไปนี้

bindings:
- members:
  - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/bigquery.user
...

6. ติดตั้งไลบรารีของไคลเอ็นต์

ติดตั้งไลบรารีไคลเอ็นต์ BigQuery Python ด้วยคำสั่งต่อไปนี้

pip3 install --user --upgrade google-cloud-bigquery

ตอนนี้คุณพร้อมที่จะเขียนโค้ดด้วย BigQuery API แล้ว

7. ค้นหาผลงานของเชกสเปียร์

ชุดข้อมูลสาธารณะคือชุดข้อมูลที่เก็บไว้ใน BigQuery และทำให้พร้อมใช้งานแบบสาธารณะ มีชุดข้อมูลสาธารณะอื่นๆ อีกมากมายให้คุณค้นหา แม้ว่าชุดข้อมูลบางส่วนจะโฮสต์โดย Google แต่ชุดข้อมูลส่วนใหญ่โฮสต์โดยบุคคลที่สาม ดูข้อมูลเพิ่มเติมได้ที่หน้าชุดข้อมูลสาธารณะ

นอกจากชุดข้อมูลสาธารณะแล้ว BigQuery ยังมีตารางตัวอย่างที่จำกัดซึ่งคุณค้นหาได้ ตารางเหล่านี้อยู่ในชุดข้อมูล bigquery-public-data:samples ตาราง shakespeare ในชุดข้อมูล samples มีดัชนีคำผลงานของเชกสเปียร์ โดยให้จำนวนครั้งที่แต่ละคำปรากฏในคลังข้อมูลแต่ละรายการ

ในขั้นตอนนี้ คุณจะค้นหาตาราง shakespeare

ขั้นแรก ใน Cloud Shell ให้สร้างแอปพลิเคชัน Python อย่างง่ายที่คุณจะใช้เพื่อเรียกใช้ตัวอย่าง Translation API

mkdir bigquery-demo
cd bigquery-demo
touch app.py

เปิดตัวแก้ไขโค้ดจากด้านขวาบนของ Cloud Shell ดังนี้

b648141af44811a3.png

ไปที่ไฟล์ app.py ในโฟลเดอร์ bigquery-demo และแทนที่โค้ดด้วยโค้ดต่อไปนี้

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT corpus AS title, COUNT(word) AS unique_words
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY title
    ORDER BY unique_words
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    title = row['title']
    unique_words = row['unique_words']
    print(f'{title:<20} | {unique_words}')

ใช้เวลาสักครู่เพื่อศึกษาโค้ดและดูว่าตารางมีการค้นหาอย่างไร

กลับไปที่ Cloud Shell แล้วเรียกใช้แอปโดยทำดังนี้

python3 app.py

คุณจะเห็นรายการคำและรายการต่างๆ ดังต่อไปนี้

hamlet               | 5318
kinghenryv           | 5104
cymbeline            | 4875
troilusandcressida   | 4795
kinglear             | 4784
kingrichardiii       | 4713
2kinghenryvi         | 4683
coriolanus           | 4653
2kinghenryiv         | 4605
antonyandcleopatra   | 4582

8. ค้นหาชุดข้อมูล GitHub

คุณจะต้องทำการค้นหาในชุดข้อมูลสาธารณะของ GitHub เพื่อให้คุ้นเคยกับ BigQuery มากขึ้น คุณจะพบข้อความคอมมิตที่พบบ่อยที่สุดใน GitHub โดยยังใช้เว็บคอนโซลของ BigQuery เพื่อดูตัวอย่างและเรียกใช้คำค้นหาเฉพาะกิจได้อีกด้วย

หากต้องการดูว่าข้อมูลมีลักษณะอย่างไร ให้เปิดชุดข้อมูล GitHub ใน UI ทางเว็บของ BigQuery โดยทำดังนี้

เปิดตาราง github_repos

คลิกปุ่ม แสดงตัวอย่าง เพื่อดูว่าข้อมูลมีลักษณะเป็นอย่างไร:

d3f0dc7400fbe678.png

ไปที่ไฟล์ app.py ในโฟลเดอร์ bigquery_demo และแทนที่โค้ดด้วยโค้ดต่อไปนี้

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

ใช้เวลาสักครู่เพื่อศึกษาโค้ดและดูว่าตารางมีการค้นหาข้อความคอมมิตที่พบบ่อยที่สุดอย่างไร

กลับไปที่ Cloud Shell แล้วเรียกใช้แอปโดยทำดังนี้

python3 app.py

คุณจะเห็นรายการข้อความคอมมิตและรายการต่างๆ ดังต่อไปนี้

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862

9. การแคชและสถิติ

BigQuery จะแคชผลการค้นหา ด้วยเหตุนี้ การค้นหาที่ตามมาจึงใช้เวลาน้อยลง คุณปิดใช้การแคชได้ด้วยตัวเลือกการค้นหา BigQuery ยังติดตามสถิติเกี่ยวกับคำค้นหาต่างๆ เช่น เวลาที่สร้าง เวลาสิ้นสุด และไบต์ทั้งหมดที่ประมวลผล

ในขั้นตอนนี้ คุณจะปิดการแคชและแสดงสถิติเกี่ยวกับข้อความค้นหา

ไปที่ไฟล์ app.py ในโฟลเดอร์ bigquery_demo และแทนที่โค้ดด้วยโค้ดต่อไปนี้

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

print('-'*60)
print(f'Created: {results.created}')
print(f'Ended:   {results.ended}')
print(f'Bytes:   {results.total_bytes_processed:,}')

ข้อควรทราบบางประการเกี่ยวกับโค้ด ขั้นแรก การแคชถูกปิดใช้โดยแนะนำ QueryJobConfig และตั้งค่า use_query_cache เป็น "เท็จ" ขั้นที่สอง คุณเข้าถึงสถิติเกี่ยวกับการค้นหาจากออบเจ็กต์งาน

กลับไปที่ Cloud Shell แล้วเรียกใช้แอปโดยทำดังนี้

python3 app.py

คุณจะเห็นรายการข้อความคอมมิตและรายการต่างๆ เช่นเดียวกับก่อนหน้านี้ นอกจากนี้ คุณควรจะเห็นสถิติบางอย่างเกี่ยวกับข้อความค้นหาในตอนท้าย:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862
------------------------------------------------------------
Created: 2020-04-03 13:30:08.801000+00:00
Ended:   2020-04-03 13:30:15.334000+00:00
Bytes:   2,868,251,894

10. กำลังโหลดข้อมูลลงใน BigQuery

หากต้องการค้นหาข้อมูลของคุณเอง คุณต้องโหลดข้อมูลลงใน BigQuery BigQuery รองรับการโหลดข้อมูลจากแหล่งที่มาหลายแห่ง ซึ่งรวมถึง Cloud Storage, บริการอื่นๆ ของ Google และแหล่งที่มาอื่นๆ ที่อ่านได้ นอกจากนี้ คุณยังสตรีมข้อมูลโดยใช้การแทรกแบบสตรีมมิงได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่หน้าการโหลดข้อมูลลงใน BigQuery

ในขั้นตอนนี้ คุณจะต้องโหลดไฟล์ JSON ที่จัดเก็บไว้ใน Cloud Storage ลงในตาราง BigQuery ไฟล์ JSON อยู่ที่ gs://cloud-samples-data/bigquery/us-states/us-states.json

หากมีข้อสงสัยเกี่ยวกับเนื้อหาในไฟล์ JSON ให้ใช้เครื่องมือบรรทัดคำสั่ง gsutil เพื่อดาวน์โหลดใน Cloud Shell

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .

คุณจะเห็นว่ามีรายชื่อรัฐในสหรัฐอเมริกา และแต่ละรัฐจะเป็นเอกสาร JSON แยกบรรทัดกัน ดังนี้

head us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

หากต้องการโหลดไฟล์ JSON นี้ลงใน BigQuery ให้ไปที่ไฟล์ app.py ภายในโฟลเดอร์ bigquery_demo และแทนที่โค้ดด้วยโค้ดต่อไปนี้

from google.cloud import bigquery

client = bigquery.Client()

gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')

job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)

print('JSON file loaded to BigQuery')

โปรดใช้เวลาสักครู่เพื่อศึกษาว่าโค้ดโหลดไฟล์ JSON และสร้างตารางที่มีสคีมาใต้ชุดข้อมูลอย่างไร

กลับไปที่ Cloud Shell แล้วเรียกใช้แอปโดยทำดังนี้

python3 app.py

ระบบจะสร้างชุดข้อมูลและตารางใน BigQuery

หากต้องการยืนยันว่าสร้างชุดข้อมูลแล้ว ให้ไปที่คอนโซล BigQuery คุณควรจะเห็นชุดข้อมูลและตารางใหม่ สลับไปที่แท็บแสดงตัวอย่างของตารางเพื่อดูข้อมูลของคุณ ดังนี้

8c7d2621820a5ac4.png

11. ยินดีด้วย

คุณเรียนรู้วิธีใช้ BigQuery ด้วย Python แล้ว

ล้างข้อมูล

โปรดทำดังนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

  • ใน Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
  • ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ของคุณ แล้วคลิกลบ
  • ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์แล้วคลิกปิดเครื่องเพื่อลบโปรเจ็กต์

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0