Как динамически получить тип данных столбца в искровом фрейме - PullRequest
0 голосов
/ 28 мая 2018

У меня есть dataframe - преобразованные 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))

Когда я использую жесткое кодирование типа [String] в 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]

1 Ответ

0 голосов
/ 30 мая 2018

Как уже упоминалось, наборы данных облегчают работу с типами.Набор данных в основном представляет собой набор строго типизированных объектов 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...