我在Parquet文件中有一个数据,并且想要对其应用自定义模式。
我在Parquet中的初始数据如下,
LEFT OUTER JOIN dbo.bookings_open_tbl AS E
我的自定义架构在下面,
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()
答案 0 :(得分:3)
Spark SQL中有两种主要的模式应用程序
schema
method的DataFrameReader
的schema
参数,该参数用于转换某些格式的数据(主要是纯文本文件)。在这种情况下,可以使用架构自动转换输入记录。schema
自变量传递给SparkSession
的createDataFrame
(采用RDD
的{{1}}或List
的变量)。在这种情况下,架构必须符合数据,并且不能用于强制转换。以上情况均不适用于您的情况:
输入是强类型的,因此Rows
(如果存在)将被阅读器忽略。
模式与数据不匹配,因此不能用于schema
。
在这种情况下,您应createDataFrame
将每一列设置为所需的类型。假设类型兼容,类似这样的事情应该起作用
cast
取决于数据格式,这可能足够了。例如,如果应转换为时间戳的字段不使用标准格式,则强制转换将不起作用,并且您必须使用Spark日期时间处理实用程序。