PySpark SelectExpr()

Pyspark Selectexpr



การใช้ฟังก์ชัน selectExpr() ใน PySpark เราสามารถประเมินนิพจน์ได้โดยตรงโดยไม่ต้องสร้าง TABLE หรือ VIEW ใดๆ ฟังก์ชันนี้มีอยู่ในโมดูล pyspark.sql.DataFrame ซึ่งคล้ายกับเมธอด select() ด้วย selectExpr() เราสามารถแสดงคอลัมน์ ใช้ฟังก์ชันในคอลัมน์ ประเมินนิพจน์ ดำเนินการรวม ฯลฯ นอกจากนี้ยังสามารถประเมิน/ระบุหลายคอลัมน์ในแต่ละครั้ง

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”

ตัวอย่าง:

  1. แสดงคอลัมน์ 'เอเคอร์' จริง
  2. เพิ่ม 100 ในคอลัมน์ 'เอเคอร์'
  3. ลบ 100 จากคอลัมน์ 'เอเคอร์'
  4. คูณ 100 ด้วยคอลัมน์ 'เอเคอร์'
  5. แบ่งคอลัมน์ 'เอเคอร์' ด้วย 100
นำเข้า 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)

# เขียน 4 นิพจน์เพื่อลบ, เพิ่ม, หารและคูณคอลัมน์เอเคอร์

agri_df.selectExpr( 'เอเคอร์' , 'เอเคอร์ - 100' , 'เอเคอร์ * 100' , 'เอเคอร์ + 100' , 'เอเคอร์ / 100' ).แสดง()

เอาท์พุต:

สถานการณ์ที่ 4: การใช้ฟังก์ชันรวม

SUM(ชื่อคอลัมน์) – มันประเมินค่าทั้งหมดในคอลัมน์ที่ระบุ

หมายถึง (column_name) – มันประเมินค่าเฉลี่ยในคอลัมน์ที่ระบุ

นาที (ชื่อคอลัมน์) – ส่งกลับองค์ประกอบขั้นต่ำระหว่างองค์ประกอบทั้งหมดในคอลัมน์ที่ระบุ

MAX(ชื่อคอลัมน์) – ส่งกลับองค์ประกอบสูงสุดในบรรดาองค์ประกอบทั้งหมดในคอลัมน์ที่ระบุ

ตัวอย่าง:

  1. ค้นหาองค์ประกอบทั้งหมด ค่าเฉลี่ย จำนวน ต่ำสุด และสูงสุดของ 'เอเคอร์'
  2. ค้นหาองค์ประกอบต่ำสุดและสูงสุดในคอลัมน์ “Soil_status”
นำเข้า 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)

#รวมการทำงาน

agri_df.selectExpr( 'ผลรวม (เอเคอร์)' , 'หมายถึง (เอเคอร์)' , 'COUNT(เอเคอร์)' , 'AVG (เอเคอร์)' , 'MIN (เอเคอร์)' ,
'MAX(เอเคอร์)' ).แสดง()

agri_df.selectExpr( 'นาที (สถานะดิน_)' , 'MAX (สถานะดิน_)' ).แสดง()

เอาท์พุต:

บทสรุป

เราได้พูดคุยเกี่ยวกับฟังก์ชัน selectExpr() ซึ่งรับคอลัมน์/ชุดของนิพจน์และส่งกลับ DataFrame ตามนิพจน์/คอลัมน์ที่ระบุ ในส่วนหนึ่งของสิ่งนี้ เราได้เรียนรู้สถานการณ์หลักสี่ประการที่สามารถใช้ selectExpr() ได้ สามารถระบุได้หลายนิพจน์ในฟังก์ชันนี้ซึ่งคั่นด้วยเครื่องหมายจุลภาค ไม่จำเป็นต้องสร้าง TEMPORARY VIEW เพื่อใช้ฟังก์ชัน selectExpr()