次のように、HiveContextでinsertステートメントを実行しようとしています。
hiveContext.sql('insert into my_table (id, score) values (1, 10)')
1.5.2 Spark SQL Documentation は、「動的パーティション挿入」をサポートしていますが、これがサポートされているかどうかを明示的に述べていません。
これは、次のようなスタックトレースにつながります。
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
isがサポートされているHiveテーブルに挿入する他の方法はありますか?
DataFrameWriterのappend
モードを使用して、Hiveテーブルにデータを追加できます。
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")
受け入れられた答え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 ....)に分割できます。ここでは、データレイクにデータを追加/挿入できます。