apache spark - "INSERT INTO..." con SparkSQL HiveContext
apache-spark apache-spark-sql (6)
Cuando haces esto por primera vez
$data.write.mode("append").saveAsTable("my_table")
debe reemplazar "append"
con "overwrite"
, luego, puede usar "append"
.
Estoy tratando de ejecutar una declaración de inserción con mi HiveContext, como esto:
hiveContext.sql(''insert into my_table (id, score) values (1, 10)'')
La 1.5.2 Documentación Spark SQL no establece explícitamente si esto es compatible o no, aunque sí admite la "inserción dinámica de particiones".
Esto conduce a una traza de pila como
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
¿Hay alguna otra manera de insertar en una tabla de Hive que sea compatible?
He tenido el mismo problema (Spark 1.5.1), y he intentado diferentes versiones.
Dado
sqlContext.sql("create table my_table(id int, score int)")
Las únicas versiones que funcionaron se parecían a esto:
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")
Intentó realizar algo que el formato del archivo de datos no puede, por lo tanto, las Unsupported language features in query
excepción de Unsupported language features in query
.
Muchos formatos de archivo de datos son de una sola escritura y no admiten operaciones ACID.
Apache ORC admite la operación ACID si lo necesita.
En su lugar, puede usar la partición para dividir sus datos en carpetas (/ data / year = 2017 / month = 10 ....), aquí puede agregar / insertar datos en su lago de datos.
La respuesta aceptada saveAsTable
falla para mí con una saveAsTable
AnalysisException
(no entiendo por qué). Lo que funciona para mí en su lugar es:
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").insertInto("my_table")
Estoy usando Spark v2.1.0.
Los datos se pueden adjuntar a una tabla de Hive usando el modo de anexado en el DataFrameWriter.
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").saveAsTable("my_table")
Esto da el mismo resultado que un inserto.
intente este hiveContext.sql("insert into table my_table select 1, 10")
si no ha cambiado su modo de partición dinámica a no estrictamente, debe hacerlo hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")