使用包含时间范围的spark Dataframe连接时间序列数据



我有两个数据框架,其中一个包含以下格式的事件详细信息(eventData)。

|id|parameter  |value|eventtime           |
+++++++++++++++++++++++++++++++++++++++++++
|1 |temperature|23   |2005-Apr-11 11:20:00|
|2 |temperature|21   |2005-Apr-12 14:34:00|

和另一个包含时间范围

Operationdata

|operationid|paramter   |start_time          |end_time            |
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|1234       |Temperature|2005-Apr-11 10:20:00|2005-Apr-11 12:20:00|
|1235       |Temperature|2005-Apr-12 14:00:00|2005-Apr-11 16:30:00|

现在,我想将这两个数据帧连接起来以获取以下输出:

|operationid|paramter   |value|eventtime           |
++++++++++++++++++++++++++++++++++++++++++++++++++++
|1234       |Temperature|23   |2005-Apr-11 11:20:00|
|1235       |Temperature|21   |2005-Apr-12 14:34:00|

我可以使用以下SQL查询

来实现这一点
joinSQL = sqlContext.sql("select OperationDF.operationid,eventDF.parameter,eventDF.value,eventDF.eventtime from eventDF,OperationDF where eventDF.eventtime >= jdbcDF.start_time AND eventDF.eventtime <= jdbcDF.end_time")

这个查询以我想要的方式返回数据,但是它在两个数据框之间做了一个笛卡尔积。

OperationDF实际上是从RDBMS获取的,我必须做SQLContext。在OperationDF上设置cacheTable以避免对数据库进行多次查询。

我是一个新手火花和我的查询现在是

  1. 是否有更好的方法来做Join并避免笛卡尔积

  2. SQLContext。cacheTable将Dataframe内容保存在驱动程序内存中,还是将其分布在集群上?

  3. 如果它被保存在驱动内存中,我们如何处理数据帧太大而不能保存在驱动内存中的情况?

谢谢。

SQLContext。cacheTable将Dataframe内容保存在驱动程序内存中,还是将其分布在集群上?

每个DataFrameRDD分布在工作节点上。除非你collect没有数据应该存储在驱动程序上。

是否有更好的方法来进行连接并避免笛卡尔积

除非内部引擎可以优化这种类型或范围连接,而据我所知,目前还不能,答案是否定的。

如果你有一些额外的信息可以用来限制结果(如最大偶数跨度),你可以使用额外的谓词来改进。

如果没有,并且您可以负担得起完整排序,则可以使用低级API和/或一些窗口函数的组合来处理此问题。

相关内容

  • 没有找到相关文章

最新更新