獲取

2017-04-09 38 views
0

我已經用以下結構存儲在一個JSON格式我的數據存儲在JSON星火值列表的統計特性:獲取

{"generationId":1,"values":[-36.0431,-35.913,...,36.0951]} 

我想要得到的間距分佈之間(不同連續數字)在文件平均值(generationIds)之間。

在我zepplein筆記本電腦上的第一行是:

import org.apache.spark.sql.SparkSession 
val warehouseLocation = "/user/hive/warehouse" 
val spark = SparkSession.builder().appName("test").config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport().getOrCreate() 
val jsonData = spark.read.json("/user/hive/warehouse/results/*.json") 
jsonData.createOrReplaceTempView("results") 

我剛纔不過意識到,這不是一個好主意。在上面的JSON數據現在看起來是這樣的:

val gen_1 = spark.sql("SELECT * FROM eig where generationId = 1") 
gen_1.show() 
+------------+--------------------+ 
|generationId|    values| 
+------------+--------------------+ 
|   1|[-36.0431, -35.91...| 
+------------+--------------------+ 

所有值都在同一領域。

你有什麼想法如何以不同的方式來解決這個問題?它不一定非要是Hive。任何Spark相關的解決方案都可以。

值的數量可以是〜10000,以後。我想將這個分佈和一個已知的函數(模擬vs理論)一起繪製出來。

回答

1

這個遞歸函數,這還不是特別優雅,當然也不經過實戰檢驗,可以計算出的差異(假設偶數大小集合):

def differences(l: Seq[Double]): Seq[Double] = { 
    if (l.size < 2) { 
     Seq.empty[Double] 
    } else { 
     val values = l.take(2) 
     Seq(Math.abs(values.head - values(1))) ++ differences(l.tail) 
    } 
} 

鑑於這樣的功能,你可以將其應用於像這樣的火花:

jsonData.map(r => (r.getLong(0), differences(r.getSeq[Double](1)))) 
+0

這很酷,感謝這篇技巧,我已經學到了一些東西。儘管我沒有看到,我怎麼能走得更遠,並得到我想要的分佈,因爲現在間距可以通過採取行[2] - 行[1],行[3] - 行[2]等來提取...,這在SQL中並不方便。 – bayerb

+0

我不是SQL專家,所以我會使用Scala REPL來創建一個函數,該函數需要一個值的集合並返回一個具有相鄰值之間差異的新集合。然後,我會看到如何將該邏輯合併到我在Spark中的DataFrame轉換中。基於我自己的經驗,基本上是一種純粹的程序化方法。 – Vidya

+0

忘記'explode'。雖然在大多數情況下都很有幫助,但我提供了一個更簡單的解決方案。 – Vidya