2017-06-05 63 views
2

我有一個記錄列表/數組,我使用explode從列表中提取數據。我想使用Java中的Spark SQL從爆炸結果中選擇第一條記錄。如何從組中選擇第一條記錄?

Dataset<Row> ds= ds.select(
    json.col("*"), 
    explode(json.col("records.record.newrecord")).as("newrecord")); 
ds= ds.select(ds.col("EVENT_SEQ"), ds.col("newrecord").apply("event").as("EVENTTYPE")); 

當前數據:

|   EVENT_SEQ|EVENTTYPE| 
+--------------------+---------+ 
|5a694d77-bc65-4bf...|  0| 
|5a694d77-bc65-4bf...|  0| 
+--------------------+---------+ 

要求:

|   EVENT_SEQ|EVENTTYPE| 
+--------------------+---------+ 
|5a694d77-bc65-4bf...|  0| 
+--------------------+---------+ 

我已經看到,暗示Cloumn.apply用於此目的的文檔,但我還沒有找到足夠的幫助讓我開始。

回答

1

這當然與first功能groupBy操作。

val ds = Seq(
    ("5a694d77-bc65-4bf...", 0), 
    ("5a694d77-bc65-4bf...", 0) 
).toDF("EVENT_SEQ", "EVENTTYPE") 
scala> ds.show 
+--------------------+---------+ 
|   EVENT_SEQ|EVENTTYPE| 
+--------------------+---------+ 
|5a694d77-bc65-4bf...|  0| 
|5a694d77-bc65-4bf...|  0| 
+--------------------+---------+ 

scala> ds.groupBy("EVENT_SEQ").agg(first("EVENTTYPE")).show 
+--------------------+-----------------------+ 
|   EVENT_SEQ|first(EVENTTYPE, false)| 
+--------------------+-----------------------+ 
|5a694d77-bc65-4bf...|      0| 
+--------------------+-----------------------+