我有两个数据框架,其中一个包含以下格式的事件详细信息(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以避免对数据库进行多次查询。
我是一个新手火花和我的查询现在是
是否有更好的方法来做Join并避免笛卡尔积
SQLContext。cacheTable将Dataframe内容保存在驱动程序内存中,还是将其分布在集群上?
如果它被保存在驱动内存中,我们如何处理数据帧太大而不能保存在驱动内存中的情况?
谢谢。
SQLContext。cacheTable将Dataframe内容保存在驱动程序内存中,还是将其分布在集群上?
每个DataFrame
或RDD
分布在工作节点上。除非你collect
没有数据应该存储在驱动程序上。
是否有更好的方法来进行连接并避免笛卡尔积
除非内部引擎可以优化这种类型或范围连接,而据我所知,目前还不能,答案是否定的。
如果你有一些额外的信息可以用来限制结果(如最大偶数跨度),你可以使用额外的谓词来改进。
如果没有,并且您可以负担得起完整排序,则可以使用低级API和/或一些窗口函数的组合来处理此问题。