[英]spark-hive - Upsert into dynamic partition hive table throws an error - Partition spec contains non-partition columns
[英]ValidationFailureSemanticException: Partition spec contains non-partition columns
我正在尝试插入到 S3 上的配置单元分区表的简单用例。 我在 EMR 上的 zeppelin notebook 上运行我的代码,下面是我的代码以及命令输出的屏幕截图。 我检查了 hive 表和数据框的架构,列名没有大小写差异。 我得到下面提到的例外。
import org.apache.spark.sql.hive.HiveContext
import sqlContext.implicits._
System.setProperty("hive.metastore.uris","thrift://datalake-hive-server2.com:9083")
val hiveContext = new HiveContext(sc)
hiveContext.setConf("hive.exec.dynamic.partition", "true")
hiveContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
spark.sql("""CREATE EXTERNAL TABLE employee_table (Emp_Id STRING, First_Name STRING, Salary STRING) PARTITIONED BY (Month STRING) LOCATION 's3n://dev-emr-jupyter/anup/'
TBLPROPERTIES ("skip.header.line.count"="1") """)
val csv_df = spark.read
.format("csv")
.option("header", "true").load("s3n://dev-emr-jupyter/anup/test_data.csv")
import org.apache.spark.sql.SaveMode
csv_df.registerTempTable("csv")
spark.sql(""" INSERT OVERWRITE TABLE employee_table PARTITION(Month) select Emp_Id, First_Name, Salary, Month from csv""")
org.apache.spark.sql.AnalysisException:org.apache.hadoop.hive.ql.metadata.Table.ValidationFailureSemanticException:分区规范 {month=, Month=May} 包含非分区列; 在 org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:106)
您需要在插入语句之前放置一个命令,以便能够在运行时填充分区。 默认情况下,动态分区模式设置为严格。
spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
尝试添加该行并再次运行。
编辑1:
我在您的csv_df.show()
图片中看到,当您执行csv_df.show()
您的工资列是最后一个,而不是月列。 尝试在插入语句中引用您的列,例如: insert into table_name partition(month) (column1, column2..)..
弗罗林
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.