วิธีการคำนวณค่าเฉลี่ยของคอลัมน์ข้อมูลและค้นหา 10% ยอดนิยม


13

ฉันยังใหม่ต่อสกาล่าและสปาร์คและกำลังออกกำลังกายด้วยตัวเองโดยใช้สถิติเบสบอล ฉันใช้คลาสเคสสร้าง RDD และกำหนดสกีมาให้กับข้อมูลจากนั้นเปลี่ยนเป็น DataFrame เพื่อให้ฉันสามารถใช้ SparkSQL เพื่อเลือกกลุ่มผู้เล่นผ่านสถิติที่ตรงกับเกณฑ์ที่กำหนด

เมื่อฉันมีกลุ่มย่อยของผู้เล่นที่ฉันสนใจที่จะดูเพิ่มเติมฉันต้องการค้นหาค่าเฉลี่ยของคอลัมน์ เช่น Batting Average หรือ RBIs จากที่นั่นฉันต้องการแบ่งผู้เล่นทั้งหมดออกเป็นกลุ่มเปอร์เซ็นไทล์ตามประสิทธิภาพโดยเฉลี่ยเมื่อเทียบกับผู้เล่นทุกคน 10% สูงสุด 10% ด้านล่าง 40-50%

ฉันสามารถใช้ฟังก์ชัน DataFrame.describe () เพื่อส่งกลับข้อมูลสรุปของคอลัมน์ที่ต้องการ (mean, stddev, count, min และ max) ทั้งหมดเป็นสตริงได้ มีวิธีที่ดีกว่าในการรับค่าเฉลี่ยและ stddev ในฐานะ Doubles และวิธีที่ดีที่สุดในการแบ่งผู้เล่นออกเป็นกลุ่ม 10 เปอร์เซ็นต์คืออะไร

จนถึงความคิดของฉันคือการหาค่าที่ bookend ช่วงเปอร์เซ็นต์และเขียนฟังก์ชั่นที่ผู้เล่นกลุ่มผ่านการเปรียบเทียบ แต่ที่รู้สึกเหมือนมันล้อมรอบในการคิดค้นล้อ

ฉันมีการนำเข้าต่อไปนี้ในขณะนี้:

 import org.apache.spark.rdd.RDD 
 import org.apache.spark.sql.SQLContext 
 import org.apache.spark.{SparkConf, SparkContext} 
 import org.joda.time.format.DateTimeFormat  

คุณตรวจสอบscaladoc แล้วหรือยัง .agg(avg(people("salary")), max(people("age")))มันมีตัวอย่างสำหรับเฉลี่ยและสูงสุดคือ: ด้วยการเรียงลำดับคุณอาจพบ (ใช้skipและtake) เปอร์เซ็นไทล์ แต่อาจมีตัวเลือกที่เร็วกว่า
Gábor Bakos

ฉันเคยเห็นสิ่งนี้มาก่อนใน scaladocs เมื่อฉันพยายามที่จะใช้พวกเขาเช่นตัวอย่างที่ฉันได้รับและข้อผิดพลาดnot found: value avgและnot found: value max
the3rdNotch

การนำเข้าของคุณคืออะไร อาจช่วยได้ง่ายขึ้นถ้ามีตัวอย่างและคุณอธิบายว่าปัญหาคืออะไร
Gábor Bakos

import org.apache.spark.rdd.RDD import org.apache.spark.sql.SQLContext import org.apache.spark.{SparkConf, SparkContext} import org.joda.time.format.DateTimeFormat
the3rdNotch

การทดสอบต่อไปนี้อาจช่วยเริ่มใช้งานฟังก์ชัน DataFrame ดูเหมือนว่าคุณจะต้องนำเข้าorg.apache.spark.sql.functions._ด้วย (BTW: ฉันคิดว่าข้อมูลเพิ่มเติมจะถูกเพิ่มเข้าไปในคำถามนั้นดีกว่าและมันก็เพียงพอที่จะเพิ่มความคิดเห็นหลังจากแก้ไข)
Gábor Bakos

คำตอบ:


21

นี่คือการนำเข้าที่คุณต้องการและวิธีรับค่าเฉลี่ยสำหรับคอลัมน์ชื่อ "RBIs":

import org.apache.spark.sql.functions._
df.select(avg($"RBIs")).show()

สำหรับค่าเบี่ยงเบนมาตรฐานให้ดูที่ scala - คำนวณค่าเบี่ยงเบนมาตรฐานของข้อมูลที่จัดกลุ่มใน Spark DataFrame - Stack Overflow

สำหรับการจัดกลุ่มตามเปอร์เซนต์ฉันแนะนำให้กำหนดคอลัมน์ใหม่ผ่านฟังก์ชั่นที่ผู้ใช้กำหนดเอง (UDF) และใช้ groupBy ในคอลัมน์นั้น ดู


4

นี่คือผลตอบแทนเฉลี่ยของคอลัมน์ด้วย

df.select (ค่าเฉลี่ย (DF ( "ColumnName"))). การแสดง ()
+ + ----------------
| เฉลี่ย (ColumnName) |
+ + ----------------
| 230.522453845909 |
+ + ----------------
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.