如何从数据库 table 中获取数据帧 JDBC 由多个日期范围切割,在另一个数据帧中每行一个日期范围?
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?
我有包含事件开始时间的 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 中的行。我想查询并从另一个 table 提取到新的 DataFrame,只有每个时间范围的开始和结束之间的项目。我怎样才能做到这一点?在这里加入是唯一的选择,还是网络查询有用?或者可能只有 DataFrame 上的 foreach 会有帮助?
我能够通过从 DataFrame 行中生成 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"
我能够以最佳方式从一次查询中的数据中提取所需的时间范围。
我有包含事件开始时间的 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 中的行。我想查询并从另一个 table 提取到新的 DataFrame,只有每个时间范围的开始和结束之间的项目。我怎样才能做到这一点?在这里加入是唯一的选择,还是网络查询有用?或者可能只有 DataFrame 上的 foreach 会有帮助?
我能够通过从 DataFrame 行中生成 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"
我能够以最佳方式从一次查询中的数据中提取所需的时间范围。