繁体   English   中英

使用 Spark DataFrame 获取列上的不同值

[英]Fetching distinct values on a column using Spark DataFrame

使用 Spark 1.6.1 版本我需要在列上获取不同的值,然后在它之上执行一些特定的转换。 该列包含超过 5000 万条记录,并且可以变得更大。
我知道做一个distinct.collect()会将调用带回驱动程序。 目前我正在执行以下任务,有没有更好的方法?

 import sqlContext.implicits._
 preProcessedData.persist(StorageLevel.MEMORY_AND_DISK_2)

 preProcessedData.select(ApplicationId).distinct.collect().foreach(x => {
   val applicationId = x.getAs[String](ApplicationId)
   val selectedApplicationData = preProcessedData.filter($"$ApplicationId" === applicationId)
   // DO SOME TASK PER applicationId
 })

 preProcessedData.unpersist()  

好吧,要在Dataframe获取所有不同的值,您可以使用distinct 正如您在文档中所见,该方法返回另一个DataFrame 之后,您可以创建一个UDF转换每条记录。

例如:

val df = sc.parallelize(Array((1, 2), (3, 4), (1, 6))).toDF("age", "salary")

// I obtain all different values. If you show you must see only {1, 3}
val distinctValuesDF = df.select(df("age")).distinct

// Define your udf. In this case I defined a simple function, but they can get complicated.
val myTransformationUDF = udf(value => value / 10)

// Run that transformation "over" your DataFrame
val afterTransformationDF = distinctValuesDF.select(myTransformationUDF(col("age")))

该解决方案演示了如何使用优于 UDF 的 Spark 原生函数来转换数据。 它还演示了dropDuplicates如何比distinct更适合某些查询。

假设你有这个 DataFrame:

+-------+-------------+
|country|    continent|
+-------+-------------+
|  china|         asia|
| brazil|south america|
| france|       europe|
|  china|         asia|
+-------+-------------+

以下是如何获取所有不同的国家并进行转换:

df
  .select("country")
  .distinct
  .withColumn("country", concat(col("country"), lit(" is fun!")))
  .show()
+--------------+
|       country|
+--------------+
|brazil is fun!|
|france is fun!|
| china is fun!|
+--------------+

如果您不想丢失continent信息,可以使用dropDuplicates而不是distinct

df
  .dropDuplicates("country")
  .withColumn("description", concat(col("country"), lit(" is a country in "), col("continent")))
  .show(false)
+-------+-------------+------------------------------------+
|country|continent    |description                         |
+-------+-------------+------------------------------------+
|brazil |south america|brazil is a country in south america|
|france |europe       |france is a country in europe       |
|china  |asia         |china is a country in asia          |
+-------+-------------+------------------------------------+

有关过滤 DataFrames 的更多信息,请参见此处有关删除重复项的更多信息,请参见此处

最终,您需要将转换逻辑包装在可以与 Dataset#transform 方法链接的自定义转换中。

在 Pyspark 中试试这个,

df.select('col_name').distinct().show()

df =  df.select("column1", "column2",....,..,"column N").distinct.[].collect()

在空列表中,如果您希望 df 为 JSON 格式,则可以插入 [to_JSON()] 之类的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM