【问题标题】:How to obtain DataFrame from the database table retrived with JDBC cut by the multiple date ranges with one date range per row in another DataFrame?如何从使用 JDBC 检索的数据库表中获取 DataFrame,该数据库表被多个日期范围切割,另一个 DataFrame 中每行一个日期范围?
【发布时间】:2022-01-19 22:06:24
【问题描述】:

我有事件开始时间的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 有帮助?

【问题讨论】:

  • 可能是一个窗口函数,但你能指定你期望的输出吗?因为描述有点不清楚。
  • @Kombajnzbożowy 发现从相对较小的数据集中提取 where 子句以从大数据集中提取唯一需要的数据对我的情况很好,我将添加答案

标签: scala apache-spark apache-spark-sql apache-zeppelin


【解决方案1】:

我能够通过从 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"

我能够以最优化的方式在一次查询中从数据中提取所需的时间范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多