извлекать элементы из обернутого массива в кадре данных искры

Я пытаюсь извлечь элементы из обернутого массива. Но это не работает. когда я пытаюсь получить доступ к элементу _image, он выдает ошибку. Ниже приведена схема структуры. Я попытался сгладить значения изображения с помощью взрыва, но это не работает.

Может кто-нибудь помочь мне, как извлечь элементы из массива, обернутого ниже.

root
 |-- gender: string (nullable = true)

 |-- item_number: string (nullable = true)

 |-- price: double (nullable = true)

 |-- size: array (nullable = true)

 |    |-- element: struct (containsNull = true)

 |    |    |-- _description: string (nullable = true)

 |    |    |-- color_swatch: array (nullable = true)

 |    |    |    |-- element: struct (containsNull = true)

 |    |    |    |    |-- _VALUE: string (nullable = true)

 |    |    |    |    |-- _image: string (nullable = true)

например, из приведенных ниже данных вложенного массива

[[Medium,WrappedArray([Red,red_cardigan.jpg],Burgundy,burgundy_cardigan.jpg])],

[Large,WrappedArray([Red,red_cardigan.jpg], [Burgundy,burgundy_cardigan.jpg])]]

код

  val flatDF1 = 
  xmlDF.select(col("_description").as("description"),col("_product_image").
  as("product_image"),

  col("catalog_item._gender").as("gender"),

  col("catalog_item.item_number").as("item_number"),col("catalog_item.price").as("price"),

  col("catalog_item.size").as("size"))

person nanda kumar    schedule 23.11.2019    source источник


Ответы (1)


Explode — это правильная встроенная функция для использования.

Учитывая следующую структуру и предположим, что вы хотите использовать API Dataframe:

case class ColorSwatch(_VALUE: String, _image: String)
case class Size(_description: String, color_swatch: Seq[ColorSwatch])
case class Cart(gender: String, item_number: String, price: Double, size: Seq[Size])

мы можем написать:

import sparkSession.implicits._
import org.apache.spark.sql.functions.explode
val df = sparkSession.emptyDataset[Cart].toDF

df.select(explode($"size").as("size_elem"))
      .select(explode($"size_elem.color_swatch").as("color_elem"))
      .select($"color_elem._image")
      .show(false)

Здесь я выбираю только элемент изображения, но мы также можем получить все связанные атрибуты (пол, описание, _value,...)

Примечание. Вы также можете использовать API набора данных с функциональным подходом (состоящим в плоском отображении ваших структур).

person baitmbarek    schedule 24.11.2019