蜂巢拼花:使用Spark Dataframe Scala进行数据验证/不良数据处理

时间:2019-04-06 23:45:29

标签: scala hive apache-spark-sql

我是Scala和Spark的新手。我正在寻找有关如何从源头解决不良数据的解决方案。

我有一个Hive外部表,作为源系统中的实木复合地板存储。假设是Employee,下面是表定义。

CREATE EXTERNAL TABLE `employee`(
`id` decimal(11,0), 
`first_name` string,
`last_name` timestamp,
`dob` timestamp,
`ssn` string
`created_timestamp` timestamp
)
STORED AS PARQUET
LOCATION
  'hdfs:///user/employee'
TBLPROPERTIES (
  'EXTERNAL'='true');

在我的Spark App中,使用SQL构造如下的数据框

val df = sparkSession.sqlContext.sql("select * from employee")

转换后保存到另一个Hive阶段表中

val transformedDF = df.select("id","dob","ssn").withColumn("full_name", concat(col("first_name"),col("last_name")))

transformedDF.write.format("parquet").mode("overwrite").save("//newLocation")

从源配置单元引入数据时,验证和处理不良记录的最佳方法是什么?

例如,如果源数据中的dob字段包含无效的日期格式(例如XXX9-01-08),而ssn数据包含的日期格式为(XXX-89-7854)。如何处理行级的不良记录?转换后,确实会将记录保存到镶木地板中的给定路径。

但是当我查询蜂巢阶段时,我得到一个错误

"Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.serde2.io.TimestampWritableV2"

如果由于错误的记录而导致异常,是否可以使用dataframewriter将记录存储在单独的路径中,以使我的配置单元表不会抛出异常?

谢谢

0 个答案:

没有答案