gpt4 book ai didi

scala - Spark 将自定义架构应用于 DataFrame

转载 作者:行者123 更新时间:2023-12-02 09:10:26 27 4
gpt4 key购买 nike

我在 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中schema的应用主要有两种

  • schema参数传递给 schema method DataFrameReader 它用于转换某些格式的数据(主要是纯文本文件)。在这种情况下,模式可用于自动转换输入记录。
  • schema参数传递给 createDataFrame (采用 RDD ListRowsSparkSession 的变体) .在这种情况下,模式必须符合数据,并且不用于转换。

  • 以上均不适用于您的情况:
  • 输入是强类型的,因此 schema ,如果存在,将被读者忽略。
  • Schema 与数据不匹配,因此不能用于 createDataFrame .

  • 在这种情况下,您应该 cast每列到所需的类型。假设类型是兼容的,这样的事情应该可以工作
    val newDataFrame = df.schema.fields.foldLeft(df){ 
    (df, s) => df.withColumn(s.name, df(s.name).cast(s.dataType))
    }

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

    关于scala - Spark 将自定义架构应用于 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998177/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com