"INSERT INTO ..." 与 SparkSQL HiveContext
"INSERT INTO ..." with SparkSQL HiveContext
我正在尝试 运行 使用我的 HiveContext 插入语句,如下所示:
hiveContext.sql('insert into my_table (id, score) values (1, 10)')
1.5.2 Spark SQL Documentation虽然支持"dynamic partition insertion",但没有明确说明是否支持。
这会导致堆栈跟踪,如
AnalysisException:
Unsupported language features in query: insert into my_table (id, score) values (1, 10)
TOK_QUERY 0, 0,20, 0
TOK_FROM 0, -1,20, 0
TOK_VIRTUAL_TABLE 0, -1,20, 0
TOK_VIRTUAL_TABREF 0, -1,-1, 0
TOK_ANONYMOUS 0, -1,-1, 0
TOK_VALUES_TABLE 1, 13,20, 41
TOK_VALUE_ROW 1, 15,20, 41
1 1, 16,16, 41
10 1, 19,19, 44
TOK_INSERT 1, 0,-1, 12
TOK_INSERT_INTO 1, 0,11, 12
TOK_TAB 1, 4,4, 12
TOK_TABNAME 1, 4,4, 12
my_table 1, 4,4, 12
TOK_TABCOLNAME 1, 7,10, 22
id 1, 7,7, 22
score 1, 10,10, 26
TOK_SELECT 0, -1,-1, 0
TOK_SELEXPR 0, -1,-1, 0
TOK_ALLCOLREF 0, -1,-1, 0
scala.NotImplementedError: No parse rules for:
TOK_VIRTUAL_TABLE 0, -1,20, 0
TOK_VIRTUAL_TABREF 0, -1,-1, 0
TOK_ANONYMOUS 0, -1,-1, 0
TOK_VALUES_TABLE 1, 13,20, 41
TOK_VALUE_ROW 1, 15,20, 41
1 1, 16,16, 41
10 1, 19,19, 44
是否有任何其他方法可以插入 支持的 Hive table?
可以使用 DataFrameWriter 上的 append
模式将数据附加到 Hive table。
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").saveAsTable("my_table")
这与插入的结果相同。
我遇到了同样的问题(Spark 1.5.1),并尝试了不同的版本。
给出
sqlContext.sql("create table my_table(id int, score int)")
唯一有效的版本如下所示:
sqlContext.sql("insert into table my_table select t.* from (select 1, 10) t")
sqlContext.sql("insert into my_table select t.* from (select 2, 20) t")
试试这个 hiveContext.sql("insert into table my_table select 1, 10")
如果您还没有将动态分区模式更改为非严格模式,则必须这样做 hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
接受的答案 saveAsTable
对我来说失败了 AnalysisException
(我不明白为什么)。对我有用的是:
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").insertInto("my_table")
我正在使用 Spark v2.1.0。
您试图执行数据文件格式无法执行的操作,因此出现 Unsupported language features in query
异常。
很多数据文件格式都是一次性写入的,不支持ACID操作。
如果需要,Apache ORC 支持 ACID 操作。
相反,您可以使用分区将数据拆分到文件夹中 (/data/year=2017/month=10....),在这里您可以将 append/insert 数据放入您的数据湖中。
当你第一次这样做时
$data.write.mode("append").saveAsTable("my_table")
您应该将"append"
替换为"overwrite"
,然后,您可以使用"append"
。
我正在尝试 运行 使用我的 HiveContext 插入语句,如下所示:
hiveContext.sql('insert into my_table (id, score) values (1, 10)')
1.5.2 Spark SQL Documentation虽然支持"dynamic partition insertion",但没有明确说明是否支持。
这会导致堆栈跟踪,如
AnalysisException:
Unsupported language features in query: insert into my_table (id, score) values (1, 10)
TOK_QUERY 0, 0,20, 0
TOK_FROM 0, -1,20, 0
TOK_VIRTUAL_TABLE 0, -1,20, 0
TOK_VIRTUAL_TABREF 0, -1,-1, 0
TOK_ANONYMOUS 0, -1,-1, 0
TOK_VALUES_TABLE 1, 13,20, 41
TOK_VALUE_ROW 1, 15,20, 41
1 1, 16,16, 41
10 1, 19,19, 44
TOK_INSERT 1, 0,-1, 12
TOK_INSERT_INTO 1, 0,11, 12
TOK_TAB 1, 4,4, 12
TOK_TABNAME 1, 4,4, 12
my_table 1, 4,4, 12
TOK_TABCOLNAME 1, 7,10, 22
id 1, 7,7, 22
score 1, 10,10, 26
TOK_SELECT 0, -1,-1, 0
TOK_SELEXPR 0, -1,-1, 0
TOK_ALLCOLREF 0, -1,-1, 0
scala.NotImplementedError: No parse rules for:
TOK_VIRTUAL_TABLE 0, -1,20, 0
TOK_VIRTUAL_TABREF 0, -1,-1, 0
TOK_ANONYMOUS 0, -1,-1, 0
TOK_VALUES_TABLE 1, 13,20, 41
TOK_VALUE_ROW 1, 15,20, 41
1 1, 16,16, 41
10 1, 19,19, 44
是否有任何其他方法可以插入 支持的 Hive table?
可以使用 DataFrameWriter 上的 append
模式将数据附加到 Hive table。
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").saveAsTable("my_table")
这与插入的结果相同。
我遇到了同样的问题(Spark 1.5.1),并尝试了不同的版本。
给出
sqlContext.sql("create table my_table(id int, score int)")
唯一有效的版本如下所示:
sqlContext.sql("insert into table my_table select t.* from (select 1, 10) t")
sqlContext.sql("insert into my_table select t.* from (select 2, 20) t")
试试这个 hiveContext.sql("insert into table my_table select 1, 10")
如果您还没有将动态分区模式更改为非严格模式,则必须这样做 hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
接受的答案 saveAsTable
对我来说失败了 AnalysisException
(我不明白为什么)。对我有用的是:
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").insertInto("my_table")
我正在使用 Spark v2.1.0。
您试图执行数据文件格式无法执行的操作,因此出现 Unsupported language features in query
异常。
很多数据文件格式都是一次性写入的,不支持ACID操作。
如果需要,Apache ORC 支持 ACID 操作。
相反,您可以使用分区将数据拆分到文件夹中 (/data/year=2017/month=10....),在这里您可以将 append/insert 数据放入您的数据湖中。
当你第一次这样做时
$data.write.mode("append").saveAsTable("my_table")
您应该将"append"
替换为"overwrite"
,然后,您可以使用"append"
。