如何动态获取spark数据帧中列的数据类型

时间:2018-05-28 02:38:04

标签: scala apache-spark

我有一个数据框 - 转换后的dtypes来映射。

val dfTypesMap:Map[String,String]] = df.dtypes.toMap

输出:

(PRODUCT_ID,StringType)
(PRODUCT_ID_BSTP_MAP,MapType(StringType,IntegerType,false))
(PRODUCT_ID_CAT_MAP,MapType(StringType,StringType,true))
(PRODUCT_ID_FETR_MAP_END_FR,ArrayType(StringType,true))

当我在row.getAS[String]中使用type [String]硬编码时,没有编译错误。

df.foreach(row => {
  val prdValue = row.getAs[String]("PRODUCT_ID")
})

我想迭代地图dfTypesMap并获得相应的值类型。有没有办法将dt列类型转换为如下所示的常规类型?

StringType --> String
MapType(StringType,IntegerType,false) ---> Map[String,Int]
MapType(StringType,StringType,true) ---> Map[String,String]
ArrayType(StringType,true) ---> List[String]

1 个答案:

答案 0 :(得分:0)

如前所述,数据集可以更轻松地处理类型。 数据集基本上是强类型JVM对象的集合。

您可以将数据映射到案例类,如此

case class Foo(PRODUCT_ID: String, PRODUCT_NAME: String)
val ds: Dataset[Foo] = df.as[Foo]

然后您可以安全地操作您键入的对象。在你的情况下你可以做

ds.foreach(foo => {
  val prdValue = foo.PRODUCT_ID
})

有关数据集的更多信息,请查看 https://spark.apache.org/docs/latest/sql-programming-guide.html#creating-datasets