Scala 使用Spark DataFrame获取列上的不同值
使用Spark 1.6.1版本,我需要在列上获取不同的值,然后在其上执行一些特定的转换。该列包含超过5000万条记录,并且可以扩大。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
我知道执行
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()