微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ValidationFailureSemanticException:分区规范包含非分区列

如何解决ValidationFailureSemanticException:分区规范包含非分区列

我正在尝试将一个简单的用例插入S3上的配置单元分区表中。我正在EMR的齐柏林飞艇笔记本上运行我的代码,下面是我的代码以及命令输出的屏幕截图。我检查了配置单元表和数据框的架构,列名称没有大小写差异。我收到下面提到的异常。

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""")

enter image description here

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)

解决方法

您需要在insert语句之前放置命令,以便能够在运行时填充分区。默认情况下,动态分区模式设置为strict。

spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")

尝试添加该行,然后再次运行。

编辑1:

我在您的图片中看到,当您执行csv_df.show()时,您的薪水列将排在最后,而不是月份列。尝试在insert语句中引用您的列,例如:insert into table_name partition(month) (column1,column2..)..

弗洛林

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。