我使用的是Spark 1.4.0(PySpark)。我使用此查询从Hive表加载了一个DataFrame:
sqlContext = HiveContext(sc)
table1_contents = sqlContext.sql("SELECT * FROM my_db.table1")
当我尝试在一些转换后从table1_contents
插入数据时,使用DataFrameWriter#insertInto函数进入table2:
sqlContext.createDataFrame(transformed_data_from_table1).write.insertInto('my_db.table2')
我遇到这个错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o364.insertInto.
: org.apache.spark.sql.AnalysisException: no such table my_db.table2;
我知道我的桌子存在,因为当我输入时:
print sqlContext.tableNames('my_db')
显示table1和table2。任何人都可以帮忙解决这个问题吗?
答案 0 :(得分:3)
我有类似的问题。看起来insertInto函数在写入非默认数据库时可能会有一些错误。将目标表更改为默认数据库后,它可以正常工作。
答案 1 :(得分:1)
这是reported bug。显然,该问题仅在即将发布的1.6.0版本中得到解决。
作为一种解决方法,您可以按照自己的意思去做,或者使用@guoxian提到的默认数据库。您也可以试用1.6.0-SNAPSHOT版本。
编辑:我链接的JIRA问题是针对Spark Scala版本的,所以我不能说如果在PySpark v 1.6.0中修复了这个问题。对不起,感到困惑。答案 2 :(得分:1)
嗨,我不知道你是否解决了这个问题。在我的工作中,我得到了类似的问题,我解决了它。我的火花版本是1.40,所以我认为@Ton Torres程序中没有错误。问题是您使用sqlContext而不是hiveContext。当您需要操作配置单元时,最好使用hiveContext来创建像这样的DataFrame
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
dfresult = hiveContext.createDataFrame(temp,structType)
hiveContext.sql("use default")
dtResult.write.insertInto("tablename")
祝你好运
答案 3 :(得分:0)
我无法做出
sqlContext.createDataFrame(transformed_data_from_table1).write.insertInto('my_db.table2')
工作,似乎SparkSQL支持INSERT
语句为字符串。
sqlContext.sql("INSERT INTO TABLE my_db.table2...");
这个有效。
虽然我仍然期待我的原始问题得到解答和工作的时间(希望未来版本的Spark,如果这是一个错误)。