我正在编写一个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和数据类型,以便可以使用相同的详细信息来更改数据类型并为配置单元表创建架构?
答案 0 :(得分:2)
StructType
通常由称为StructField
的子元素组成,其子元素如下:
StructField(String name, DataType dataType, boolean nullable, Metadata metadata)
要获取这些字段,您只需执行
val tbSchema = yearDF.schema.map(s => (s.name, s.dataType))