Spark将自定义架构应用于DataFrame

时间:2018-10-25 21:10:45

标签: scala apache-spark apache-spark-sql parquet

我在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()

1 个答案:

答案 0 :(得分:3)

Spark SQL中有两种主要的模式应用程序

    传递给schema methodDataFrameReader
  • schema参数,该参数用于转换某些格式的数据(主要是纯文本文件)。在这种情况下,可以使用架构自动转换输入记录。
  • schema自变量传递给SparkSessioncreateDataFrame(采用RDD的{​​{1}}或List的变量)。在这种情况下,架构必须符合数据,并且不能用于强制转换。

以上情况均不适用于您的情况:

  • 输入是强类型的,因此Rows(如果存在)将被阅读器忽略。

  • 模式与数据不匹配,因此不能用于schema

在这种情况下,您应createDataFrame将每一列设置为所需的类型。假设类型兼容,类似这样的事情应该起作用

cast

取决于数据格式,这可能足够了。例如,如果应转换为时间戳的字段不使用标准格式,则强制转换将不起作用,并且您必须使用Spark日期时间处理实用程序。