我是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将记录存储在单独的路径中,以使我的配置单元表不会抛出异常?
谢谢