![](/img/trans.png)
[英]Spark-SQL : How to read a TSV or CSV file into dataframe and apply a custom schema?
[英]Spark apply custom schema to a DataFrame
我在Parquet文件中有一个数据,想要对它应用自定义架构。
我在Parquet中的初始数据如下所示,
root
|-- CUST_ID: decimal(9,0) (nullable = true)
|-- INACTV_DT: string (nullable = true)
|-- UPDT_DT: string (nullable = true)
|-- ACTV_DT: string (nullable = true)
|-- PMT_AMT: decimal(9,4) (nullable = true)
|-- CMT_ID: decimal(38,14) (nullable = true)
我的自定义架构如下
root
|-- CUST_ID: decimal(38,0) (nullable = false)
|-- INACTV_DT: timestamp (nullable = false)
|-- UPDT_DT: timestamp (nullable = false)
|-- ACTV_DT: timestamp (nullable = true)
|-- PMT_AMT: decimal(19,4) (nullable = true)
|-- CMT_ID: decimal(38,14) (nullable = false)
下面是我的代码,将新的数据框架应用于它
val customSchema = getOracleDBSchema(sparkSession, QUERY).schema
val DF_frmOldParkquet = sqlContext_par.read.parquet("src/main/resources/data_0_0_0.parquet")
val rows: RDD[Row] = DF_frmOldParkquet.rdd
val newDataFrame = sparkSession.sqlContext.createDataFrame(rows, tblSchema)
newDataFrame.printSchema()
newDataFrame.show()
执行此操作时,我遇到错误。
java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: java.lang.String is not a valid external type for schema of timestamp
staticinvoke(class org.apache.spark.sql.types.Decimal$, DecimalType(38,0), fromDecimal, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, CUST_ID), DecimalType(38,0)), true) AS CUST_ID#27
Spark SQL中有两种主要的模式应用程序
DataFrameReader
schema
方法的schema
参数,该DataFrameReader
用于转换某些格式的数据(主要是纯文本文件)。 在这种情况下,模式可用于自动转换输入记录。 schema
传递给自变量createDataFrame
(其采取变体RDD
或List
的Rows
的的) SparkSession
。 在这种情况下,模式必须符合数据,并且不用于强制转换。 上述情况均不适用于您的情况:
输入是强类型的,因此如果存在schema
,那么读者将忽略它。
模式与数据不匹配,因此不能用于createDataFrame
。
在这种情况下,您应该cast
每一列都强制转换为所需的类型。 假设类型兼容,这样的事情应该起作用
val newDataFrame = df.schema.fields.foldLeft(df){
(df, s) => df.withColumn(s.name, df(s.name).cast(s.dataType))
}
根据数据的格式,这是否足够? 例如,如果应转换为时间戳记的字段不使用标准格式,则强制转换将不起作用,并且您必须使用Spark日期时间处理实用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.