2017-05-19 47 views
1

我创建拼花文件数据框如下:如何在Spark中打印DataFrame列的唯一值?

DataFrame parquetFile = sqlContext.read().parquet("test_file.parquet"); 
parquetFile.printSchema(); 
parquetFile.registerTempTable("myData"); 
DataFrame data_df = sqlContext.sql("SELECT * FROM myData"); 

现在我想打印出一个名为field1列的所有唯一值。

我知道如果使用Python,可以运行import pandas as pd,然后将data_df转换为pandas DataFrame,之后使用unique()

但我怎么能在Java中做到这一点?

+1

'从myData'(字段1)选择不同? – philantrovert

+0

@philantrovert:你能否发表你的答案?在大数据集的情况下,您的解决方案可以更好地工作,因为它不会将所有数据加载到数据框中。它选择所需的数据。 – Dinosaurius

+0

有人已经发布了它:D btw,你可以尝试'data_df.select(data_df(“field1))distinct'吗?这不应该加载整个数据,并且可能因为spark内部优化而更快。 – philantrovert

回答

2

这是非常简单的通过

parquetFile.dropDuplicates("field1") 

这使您只有distinct行获得distinct值,可以使用不同功能的SQL查询

DataFrame data_df = sqlContext.sql("SELECT DISTINCT(field1) FROM myData"); 

下面是一个例子:

val myData = Seq("h", "h", "d", "b", "d").toDF("field1") 
myData.createOrReplaceTempView("myData") 
val sqlContext = spark.sqlContext 
sqlContext.sql("SELECT DISTINCT(field1) FROM myData").show() 

此给出以下的输出:

+------+                   
|field1| 
+------+ 
|  h| 
|  d| 
|  b| 
+------+ 

希望这有助于,最佳Regrads

1

您可以删除重复的和field1

1
DataFrame uniqueDF = data_df.groupBy("field1"); 
uniqueDF.show(); 
相关问题