如何在Scala中解析StructType的字段?

时间:2018-07-26 07:07:48

标签: scala apache-spark hive

我正在编写一个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和数据类型,以便可以使用相同的详细信息来更改数据类型并为配置单元表创建架构?

1 个答案:

答案 0 :(得分:2)

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

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

要获取这些字段,您只需执行

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