簡體   English   中英

在Apache Spark SQL中對多行進行操作

[英]Operating on Multiple Rows in Apache Spark SQL

我正在嘗試在Apache Spark SQL中創建一個對多行數據進行操作的函數,但未能找到直接在Spark中執行此操作的方法-在Java中。

我當前的解決方案是將數據從Spark DataFrames提取到Java List中進行處理,然后再返回Spark DataFrame。 這不是理想的性能。

最好的選擇似乎是Window函數 ,但是不幸的是,這些函數需要Hive上下文,而我無法訪問它。 explode()函數似乎是另一個選擇,但是同樣,這是Scala特定的,我無法使其在Java中工作。

也許可以通過將DataFrame轉換回RDD來完成?

如果有人對在Java中如何使用Apache Spark SQL做到這一點有任何技巧或建議,將不勝感激。 謝謝。

更新 :提供的示例:

+----------+-----------+------------+
|   Item   | Timestamp | Difference |
+----------+-----------+------------+
|     A    |   11:00   |    02:00   |
|     A    |   13:00   |      -     |
+----------+-----------+------------+
|     B    |   09:00   |      -     |
+----------+-----------+------------+
|     C    |   15:15   |    00:20   |
|     C    |   15:35   |    01:30   |
|     C    |   17:05   |      -     |
+----------+-----------+------------+

因此,在示例中,我嘗試對按項分組的成對的行進行運算,以計算每個項行之間的時間差。

使用SQL中的LAG()和LEAD()函數可以完成此任務,但是這些需要Spark中的Hive。

從Spark 1.5開始,您現在可以定義UDAF或用戶定義的聚合函數,以使您可以對輸入數據組執行自定義聚合。 我認為這可能是我所看到的與您所尋找的最接近的東西。

通常,您需要創建一個擴展UserDefinedAggregateFunction的類並實現涉及初始化,合並和聚合的所需方法。

創建后,可以實例化它,注冊它,然后在SQL中使用它。

val myAggregation = new MyAggregation 
sqlContext.udf.register("MY_AGG", myAggregation)

https://databricks.com/blog/2015/09/16/spark-1-5-dataframe-api-highlights-datetimestring-handling-time-intervals-and-udafs.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM