我可以使用数据框中的SELECT而不是创建此临时表吗?

时间:2016-07-21 07:07:55

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

我目前正在使用:

+---+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
|id |sen                      |attributes                                                                                                                                                    |
+---+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
|1  |Stanford is good college.|[[Stanford,ORGANIZATION,NNP], [is,O,VBZ], [good,O,JJ], [college,O,NN], [.,O,.], [Stanford,ORGANIZATION,NNP], [is,O,VBZ], [good,O,JJ], [college,O,NN], [.,O,.]]|
+---+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+

 I want to get above df from :
+----------+--------+--------------------+
|article_id|     sen|           attribute|
+----------+--------+--------------------+
|         1|example1|[Standford,Organi...|
|         1|example1|           [is,O,VP]|
|         1|example1| [good,LOCATION,ADP]|
+----------+--------+--------------------+

使用:

df3.registerTempTable("d1")
val df4 = sqlContext.sql("select article_id,sen,collect(attribute) as attributes from d1 group by article_id,sen")

有没有办法我不必注册临时表,因为在保存数据帧时,它会给你很多垃圾!有点df3。选择"" ??

1 个答案:

答案 0 :(得分:2)

Spark目前必须针对数据帧运行SQL的唯一方法是通过临时表。但是,您可以向DataFrame添加隐式方法以自动执行此操作,就像我们在Swoop所做的那样。我无法共享所有代码,因为它使用了许多内部实用程序和暗示但核心在以下gist。使用唯一临时表的重要性在于(至少在Spark 2.0之前)临时表是集群全局的。

我们在工作中经常使用这种方法,特别是因为在很多情况下,SQL比Scala DSL更容易编写和理解。

希望这有帮助!