【问题标题】:Proper Schema for Spark (when loading data into Dataframe)Spark 的正确模式(将数据加载到 Dataframe 时)
【发布时间】:2017-02-07 15:39:00
【问题描述】:

在表上运行 describe 后,我在 RedShift 中具有以下结构(所有字段均为 Nullable):

a integer
b numeric(18)
c date
d char(3)
e smallint
f char(1)
g varchar(20)
h numeric(11,2)

所有数据都被提取到 S3。现在想将数据加载到 Spark Dataframe 中,但还需要为此表创建适当的架构。

这些字段的 Spark 架构会是什么样子?

这个结构正确吗? (特别想知道 Numeric (11,2)、Date、Char(1) 字段)

val schema = StructType( 
    Array( 
        StructField("a", IntegerType, true), 
        StructField("b", IntegerType, true), 
        StructField("c", StringType, true),
        StructField("d", StringType, true),
        StructField("e", IntegerType, true),
        StructField("f", StringType, true),
        StructField("g", StringType, true),
        StructField("h", IntegerType, true)
    ) 
) 

【问题讨论】:

    标签: scala apache-spark schema structure


    【解决方案1】:

    你应该使用:

    • DoubleTypeDecimalType 用于浮点值(如 NUMERIC(11,2))。我认为 Decimal 更好,因为它在 BigDecimals 上运行
    • LongType 用于非常大的数字 - 例如 NUMERIC(18)。否则无法妥善保存
    • DateType 用于日期 - 它可以存储为字符串,但如果可以,您应该选择更有意义的类型

    【讨论】:

    • 谢谢! DateType 是否需要遵循特定格式(或转换为特定格式)? (例如 MM/DD/YYYY HH:MM:SS)
    • @Joe 您可以轻松地将任何格式的字符串转换为日期:stackoverflow.com/questions/40763796/…
    • 什么时候我们应该使用 LongType 而不是 IntegerType? (例如,当数据库中的字段定义为 Numeric(5) 或 Numeric(10) 或 Numeric(15)...?)
    • 整数的最大值为 2147483647。如果你使用更大的数字,那么你应该使用 LongType。 b 可以有 18 位数字,所以它应该是 LongTypeh 也太大了,但也有小数部分 - 这就是为什么我推荐 DecimalType (或 DoubleType 如果你在代码中使用 Doubles - Decimal 更安全可以容纳更大的数字)
    • 谢谢。尝试 DecimalType 时出现此错误(所有其他类型都可以): :84: error: type mismatch;找到:org.apache.spark.sql.types.DecimalType.type 需要:org.apache.spark.sql.types.DataType StructField("aff_num",DecimalType, true)
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2018-11-30
    • 2016-07-15
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多