注意:这是用齐柏林飞艇笔记本编写的。
我一直在尝试复制源表的内容,将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)
答案 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")
假设,支持插入表。何时执行 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
您有这行代码。
# 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")