Pyspark.sql.DataFrame.selectExpr()
ฟังก์ชัน selectexpr() รับคอลัมน์/ชุดของนิพจน์และส่งกลับ DataFrame ตามนิพจน์/คอลัมน์ที่ระบุ สามารถระบุได้หลายนิพจน์ในฟังก์ชันนี้ซึ่งคั่นด้วยเครื่องหมายจุลภาค ในการแสดง DataFrame เราสามารถใช้ฟังก์ชัน show()/collect()
ไวยากรณ์:
pyspark_DataFrame_object.selectExpr('คอลัมน์'/'นิพจน์')
ที่นี่ pyspark_DataFrame_object เป็นอินพุต PySpark DataFrame
สถานการณ์ที่ 1: เลือกคอลัมน์
ในสถานการณ์สมมตินี้ เราจะดูวิธีการเลือกคอลัมน์เฉพาะจาก PySpark DataFrame โดยใช้ฟังก์ชัน selectExpr()
นิพจน์ที่ใช้คือ “existing_column as new_name” ที่นี่ คอลัมน์ที่มีอยู่คือชื่อคอลัมน์ที่มีอยู่ใน DataFrame และแสดงเป็น new_name (Aliasing)
ตัวอย่าง:
สร้าง PySpark DataFrame ชื่อ “agri_df” ที่มี 5 แถวและคอลัมน์ รับคอลัมน์ 'Soil_status' และ 'Soil_Type' เป็น 'STATUS' และ 'TYPE'
นำเข้า pysparkจาก pyspark.sql นำเข้า SparkSession
linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()
# ข้อมูลการทำฟาร์มที่มี 5 แถวและ 5 คอลัมน์
เกษตร =[{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 2500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 3500 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'อินเดีย' },
{ 'ดิน_ชนิด' : ไม่มี , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 210 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหราชอาณาจักร' },
{ 'ดิน_ชนิด' : 'อื่น' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 1,000 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'ทราย' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'อินเดีย' }]
# สร้าง dataframe จากข้อมูลด้านบน
agri_df = linuxhint_spark_app.createDataFrame (agri)
# รับ Soil_status และ Soil_Type เป็น 'STATUS' และ 'TYPE'
agri_df.selectExpr( 'Soil_status เป็นสถานะ' , 'Soil_Type เป็น TYPE' ).แสดง()
เอาท์พุต:
สถานการณ์ที่ 2: การระบุนิพจน์ตามเงื่อนไข
ในสถานการณ์สมมตินี้ เราจะดูวิธีการประเมินเงื่อนไขภายในฟังก์ชัน selectExpr()
นิพจน์ที่ใช้คือค่าโอเปอเรเตอร์ที่มีอยู่ ในที่นี้ คอลัมน์ที่มีอยู่คือชื่อคอลัมน์ที่มีอยู่ใน DataFrame และเราจะเปรียบเทียบแต่ละค่าในคอลัมน์นี้กับสตริง/ค่า
ตัวอย่างที่ 1:
ตรวจสอบว่าใช่ประเทศ “USA” หรือไม่ ใช้ตัวดำเนินการเท่ากับ (=) ที่นี่
นำเข้า pysparkจาก pyspark.sql นำเข้า SparkSession
linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()
# ข้อมูลการทำฟาร์มที่มี 5 แถวและ 5 คอลัมน์
เกษตร =[{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 2500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 3500 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'อินเดีย' },
{ 'ดิน_ชนิด' : ไม่มี , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 210 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหราชอาณาจักร' },
{ 'ดิน_ชนิด' : 'อื่น' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 1,000 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'ทราย' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'อินเดีย' }]
# สร้าง dataframe จากข้อมูลด้านบน
agri_df = linuxhint_spark_app.createDataFrame (agri)
#ตรวจสอบว่าใช่ประเทศ 'USA' หรือไม่
agri_df.selectExpr( 'ประเทศ = 'สหรัฐอเมริกา'' ).แสดง()
เอาท์พุต:
ตัวอย่างที่ 2:
ตรวจสอบว่า Soil_Type เป็น NULL หรือไม่ คีย์เวิร์ด NULL ตรวจสอบว่าค่านั้นเป็น NULL หรือไม่ หากเป็นโมฆะ ระบบจะคืนค่าจริง มิฉะนั้นจะส่งกลับค่าเท็จ นิพจน์สุดท้ายคือ “Soil_Type IS NULL”
นำเข้า pysparkจาก pyspark.sql นำเข้า SparkSession
linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()
# ข้อมูลการทำฟาร์มที่มี 5 แถวและ 5 คอลัมน์
เกษตร =[{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 2500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 3500 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'อินเดีย' },
{ 'ดิน_ชนิด' : ไม่มี , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 210 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหราชอาณาจักร' },
{ 'ดิน_ชนิด' : 'อื่น' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 1,000 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'ทราย' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'อินเดีย' }]
# สร้าง dataframe จากข้อมูลด้านบน
agri_df = linuxhint_spark_app.createDataFrame (agri)
# ตรวจสอบว่า Soil_Type เป็น NULL หรือไม่
agri_df.selectExpr( 'Soil_Type เป็นโมฆะ' ).แสดง()
เอาท์พุต:
สถานการณ์ที่ 3: การประเมินนิพจน์
ในสถานการณ์สมมตินี้ เราจะดูวิธีการระบุนิพจน์ทางคณิตศาสตร์ นิพจน์ที่ใช้คือ “existing_column mathematical_expression”
ตัวอย่าง:
- แสดงคอลัมน์ 'เอเคอร์' จริง
- เพิ่ม 100 ในคอลัมน์ 'เอเคอร์'
- ลบ 100 จากคอลัมน์ 'เอเคอร์'
- คูณ 100 ด้วยคอลัมน์ 'เอเคอร์'
- แบ่งคอลัมน์ 'เอเคอร์' ด้วย 100
จาก pyspark.sql นำเข้า SparkSession
linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()
# ข้อมูลการทำฟาร์มที่มี 5 แถวและ 5 คอลัมน์
เกษตร =[{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 2500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 3500 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'อินเดีย' },
{ 'ดิน_ชนิด' : ไม่มี , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 210 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหราชอาณาจักร' },
{ 'ดิน_ชนิด' : 'อื่น' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 1,000 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'ทราย' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'อินเดีย' }]
# สร้าง dataframe จากข้อมูลด้านบน
agri_df = linuxhint_spark_app.createDataFrame (agri)
# เขียน 4 นิพจน์เพื่อลบ, เพิ่ม, หารและคูณคอลัมน์เอเคอร์
agri_df.selectExpr( 'เอเคอร์' , 'เอเคอร์ - 100' , 'เอเคอร์ * 100' , 'เอเคอร์ + 100' , 'เอเคอร์ / 100' ).แสดง()
เอาท์พุต:
สถานการณ์ที่ 4: การใช้ฟังก์ชันรวม
SUM(ชื่อคอลัมน์) – มันประเมินค่าทั้งหมดในคอลัมน์ที่ระบุ
หมายถึง (column_name) – มันประเมินค่าเฉลี่ยในคอลัมน์ที่ระบุ
นาที (ชื่อคอลัมน์) – ส่งกลับองค์ประกอบขั้นต่ำระหว่างองค์ประกอบทั้งหมดในคอลัมน์ที่ระบุ
MAX(ชื่อคอลัมน์) – ส่งกลับองค์ประกอบสูงสุดในบรรดาองค์ประกอบทั้งหมดในคอลัมน์ที่ระบุ
ตัวอย่าง:
- ค้นหาองค์ประกอบทั้งหมด ค่าเฉลี่ย จำนวน ต่ำสุด และสูงสุดของ 'เอเคอร์'
- ค้นหาองค์ประกอบต่ำสุดและสูงสุดในคอลัมน์ “Soil_status”
จาก pyspark.sql นำเข้า SparkSession
linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()
# ข้อมูลการทำฟาร์มที่มี 5 แถวและ 5 คอลัมน์
เกษตร =[{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 2500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'สีดำ' , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 3500 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'อินเดีย' },
{ 'ดิน_ชนิด' : ไม่มี , 'การชลประทาน_ความพร้อมใช้' : 'ใช่' , 'เอเคอร์' : 210 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'สหราชอาณาจักร' },
{ 'ดิน_ชนิด' : 'อื่น' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 1,000 , 'สถานะดิน_' : 'เปียก' ,
'ประเทศ' : 'สหรัฐอเมริกา' },
{ 'ดิน_ชนิด' : 'ทราย' , 'การชลประทาน_ความพร้อมใช้' : 'เลขที่' , 'เอเคอร์' : 500 , 'สถานะดิน_' : 'แห้ง' ,
'ประเทศ' : 'อินเดีย' }]
# สร้าง dataframe จากข้อมูลด้านบน
agri_df = linuxhint_spark_app.createDataFrame (agri)
#รวมการทำงาน
agri_df.selectExpr( 'ผลรวม (เอเคอร์)' , 'หมายถึง (เอเคอร์)' , 'COUNT(เอเคอร์)' , 'AVG (เอเคอร์)' , 'MIN (เอเคอร์)' ,
'MAX(เอเคอร์)' ).แสดง()
agri_df.selectExpr( 'นาที (สถานะดิน_)' , 'MAX (สถานะดิน_)' ).แสดง()
เอาท์พุต:
บทสรุป
เราได้พูดคุยเกี่ยวกับฟังก์ชัน selectExpr() ซึ่งรับคอลัมน์/ชุดของนิพจน์และส่งกลับ DataFrame ตามนิพจน์/คอลัมน์ที่ระบุ ในส่วนหนึ่งของสิ่งนี้ เราได้เรียนรู้สถานการณ์หลักสี่ประการที่สามารถใช้ selectExpr() ได้ สามารถระบุได้หลายนิพจน์ในฟังก์ชันนี้ซึ่งคั่นด้วยเครื่องหมายจุลภาค ไม่จำเป็นต้องสร้าง TEMPORARY VIEW เพื่อใช้ฟังก์ชัน selectExpr()