【问题标题】:How to parse the fields of StructType in Scala?如何在Scala中解析StructType的字段?
【发布时间】:2018-07-26 15:16:50
【问题描述】:

我正在编写一个 spark-jdbc 程序来从 postgres db 读取数据并将相同的数据移动到 HDFS 上的 Hive。 我能够从 postgres 读取数据。在将数据移动到 Hive 之前,我必须在 Hive 上为相同的数据创建模式和表,并且使用我们项目提供的数据类型,这些数据类型类似于 postgres 上的数据类型。 例如:

source datatype                            Hive datatype
character varying\([0-9]{1,4}\)       ->    string
bigint                                ->    bigint
integer                               ->    int
smallint                              ->    int
numeric\([0-9]{1,3},0\)               ->    bigint
numeric\([0-9]{1,3},[1-9][0-9]{0,2}\) ->    double

如果源上的列具有数据类型 smallint,则应在 Hive 上将其设为 int。我使用函数'schema'得到了架构

val tbSchema = yearDF.schema

现在 tbSchema 以 org.apache.spark.sql.types.StructType 的形式出现,我不明白如何解析和读取其中的值。

例如,如果 StructType 有:StructType(StructField(id,IntegerType,false), StructField(name,StringType,true), StructField(company,StringType,true))

如何读取它并从集合中提取 columnName 和数据类型,以便我可以使用相同的详细信息来更改数据类型并为 hive 表创建架构?

【问题讨论】:

    标签: scala apache-spark hive


    【解决方案1】:

    StructType 通常由称为StructField 的子元素组成,其构造函数如下:

    StructField(String name, DataType dataType, boolean nullable, Metadata metadata)
    

    要获取这些字段,您可以这样做

    val tbSchema = yearDF.schema.map(s => (s.name, s.dataType))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2018-01-19
      • 2018-12-09
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2019-02-15
      相关资源
      最近更新 更多