为什么在使用非默认数据库中的表时insertInto会失败?

时间:2015-07-15 05:53:20

标签: apache-spark hive pyspark apache-spark-sql apache-spark-1.4

我使用的是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。任何人都可以帮忙解决这个问题吗?

4 个答案:

答案 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,如果这是一个错误)。