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

Scala 使用Spark DataFrame获取列上的不同值,scala,apache-spark,dataframe,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Dataframe,Apache Spark Sql,Spark Dataframe,使用Spark 1.6.1版本,我需要在列上获取不同的值,然后在其上执行一些特定的转换。该列包含超过5000万条记录,并且可以扩大。 我知道执行distinct.collect()会将调用带回驱动程序。目前我正在执行以下任务,是否有更好的方法 import sqlContext.implicits._ preProcessedData.persist(StorageLevel.MEMORY_AND_DISK_2) preProcessedData.select(ApplicationId

使用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
。之后,您可以创建一个
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
更适合某些查询

假设您有以下数据帧:

+-------+-------------+
|country|    continent|
+-------+-------------+
|  china|         asia|
| brazil|south america|
| france|       europe|
|  china|         asia|
+-------+-------------+
以下是如何选择所有不同的国家并进行转型:

df
.选择(“国家”)
不同的
.withColumn(“国家”),concat(col(“国家”),lit(“很有趣!”)
.show()
如果您不想丢失
信息,可以使用
dropDuplicates
而不是
distinct

df
.副本(“国家”)
.带列(“说明”,concat(col(“国家”),lit(“是中的一个国家”),col(“大陆”))
.show(假)
有关筛选数据帧和的更多信息,请参阅

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

df =  df.select("column1", "column2",....,..,"column N").distinct.[].collect()
如果希望df采用JSON格式,可以在空列表中插入类似[to_JSON()]的值。

在Pyspark中,请尝试以下操作


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

dropDuplicates允许您维护数据帧中的所有列信息,但对指定给dropDuplicates命令的列执行distinct。
+-------+-------------+------------------------------------+
|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          |
+-------+-------------+------------------------------------+
df =  df.select("column1", "column2",....,..,"column N").distinct.[].collect()