我有帶有事件開始時間的 DataFrame:
val dailySummariesDfVisualize =
dailySummariesDf
.orderBy("event_time").registerTempTable("raw")
val df = sqlContext.sql("select * from raw")
df.show()
-------------------- ------------------- ------------- ----------------- ---------------
| event_type| event_time|event_payload|coffee_machine_id|digital_twin_id|
-------------------- ------------------- ------------- ----------------- ---------------
|Large_Cup_Button_...|2021-03-24 07:06:34| null| NP20100005| NP20100005|
|Large_Cup_Button_...|2021-03-24 07:07:41| null| NP20100005| NP20100005|
我希望每一event_time行都是時間范圍的開始和時間范圍event_time 1 minute的結束,并且時間范圍與上面 DataFrame 中的行數一樣多。我想從另一個表中查詢并提取到新的 DataFrame 僅每個時間范圍的開始和結束之間的專案。我怎樣才能做到這一點?加入這里是唯一的選擇,還是網路查詢有用?或者可能只有 DataFrame 上的 foreach 有幫助?
uj5u.com熱心網友回復:
我能夠通過從 DataFrame Rows 在 scala 中生成 where 子句來解決這個問題,與我從中進行提取查詢的資料相比,這些子句并不多:
var collectedString = scala.collection.mutable.MutableList[String]()
for (row <- dailySummariesDfVisualize.collectAsList())
{
println(row(1))
val start = row(1)
val end = row(5)
val timeSelection = s" time > ' ${start}' and time < '${end}'"
collectedString =timeSelection
}
val whereClause = collectedString.mkString(" or ")
println(whereClause)
val dailySensorData =
getDFFromJdbcSource(SparkSession.builder().appName("test").master("local").getOrCreate(),
s"SELECT * FROM values WHERE " whereClause " limit 1000000")
.persist(StorageLevel.MEMORY_ONLY_SER)
dailySensorData.show(400, false)
它以可接受的性能輸出我實際需要的東西。
格式化的 whereClause 輸出類似于:
time > ' 2021-03-24 07:06:34.0' and time < '2021-03-24 07:08:34.0' or time > ' 2021-03-24 07:07:41.0' and time < '2021-03-24 07:09:41.0' or time > ' 2021-03-24 07:07:43.0' and time < '2021-03-24 07:09:43.0'
等等
所以只需將此 where 子句添加到
s"SELECT * FROM values WHERE " whereClause " limit 1000000"
我能夠以最佳方式從一個查詢中的資料中僅提取所需的時間范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/387349.html
標籤:斯卡拉 阿帕奇火花 apache-spark-sql 阿帕奇齐柏林飞艇
上一篇:如何用貓效應取消可完成的未來3
