我有一个dataframe转换成的dtype到map。
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]
中使用类型字符串硬编码时,没有编译错误。
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]
发布于 2018-05-30 08:46:34
如前所述,数据集使处理类型变得更容易。Dataset基本上是强类型JVM对象的集合。
您可以将数据映射到case类,如下所示
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
https://stackoverflow.com/questions/50558426
复制