Pyspark:使用Zeppelin Notebook在Hive中插入表的问题

时间:2018-10-15 20:03:46

标签: python hive pyspark

注意:这是用齐柏林飞艇笔记本编写的。

我一直在尝试复制源表的内容,将NULLS设置为0,然后将其插入目标表。但是,我一直遇到错误:

AnalysisException: u'\nUnsupported language features in query: INSERT INTO TABLE..

在线阅读时,Spark似乎不支持INSERT INTO,但是,我一直在阅读,您可以使用数据框并将其附加到表中。这是我的原始代码:

%pyspark
from pyspark.context import SparkContext

df = sqlContext.sql("SELECT * FROM test_target")

dfr=df.collect()
print(dfr)

这是我尝试实现INSERT INTO / dataframe方法的尝试。我仍然遇到相同的AnalysisException错误。

%pyspark
from pyspark.context import SparkContext

sql = sqlContext.sql("INSERT INTO TABLE kenny_target(`user`, `age`) SELECT `user`, COALESCE(`age`, 0L) FROM kenny_source")
frame= sqlContext.createDataFrame(sql).collect()
frame.write.mode("append").saveAsTable("kenny_source_test")

test = sqlContext.sql("SELECT * FROM test_source_test")
dfr=test.collect()
print(dfr)

1 个答案:

答案 0 :(得分:1)

您提供了以下代码。

%pyspark
from pyspark.context import SparkContext

sql = sqlContext.sql("INSERT INTO TABLE kenny_target(`user`, `age`) SELECT 
`user`, COALESCE(`age`, 0L) FROM kenny_source")
frame= sqlContext.createDataFrame(sql).collect()
frame.write.mode("append").saveAsTable("kenny_source_test")

由于某些原因您无法执行此操作。

1。您正在尝试再次创建一个DataFrame。

假设,支持插入表。何时执行 sqlContext.sql (     将创建一个DataFrame)。

sql = sqlContext.sql("INSERT INTO TABLE kenny_target('user', 'age') SELECT 'user', COALESCE('age', 0L) FROM kenny_source")

接下来是这一行。运行此命令时,spark会引发错误。

frame = sqlContext.createDataframe(sql)
  

TypeError:数据已经是一个DataFrame

2。您正在尝试收集()一个DataFrame并将其写入表中。

您有这行代码。

# Since, you wrote sql = sqlContext.sql('query')
# You could write frame = sql.collect()
frame = sqlContext.createDataFrame(sql).collect()
  

注意,收集完一个       DataFrame(在这种情况下为框架),它不再是DataFrame。一种       collect()始终将DataFrame收集为列表。

最后一行不起作用,因为 frame 是一个列表(就像您对它的collect()一样)。

frame.write.mode("append").saveAsTable("kenny_source_test")

它抛出一个错误说明

  

“列表”对象没有属性“写”#原因:框架现在是列表

解决方案:

# SELECT user and age into 'frame' by creating a DataFrame called as 'frame'
frame = sqlContext.sql('''SELECT `user`, COALESCE(`age`, 0L) FROM kenny_source''')

# Write it to the table: kenny_source_test
frame.write.mode("append").saveAsTable("kenny_source_test")