Как удалить элемент массива в фрейме данных PySpark? - PullRequest
1 голос
/ 16 июня 2020

Я хочу удалить штрих-код из этого массива.

Мой фрейм данных выглядит как образец, приведенный ниже,

|-- variants: array (nullable = true)

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

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

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

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

Можете ли вы помочь мне удалить элемент из фрейма данных с помощью PySpark.

1 Ответ

1 голос
/ 16 июня 2020

Вы можете использовать array_zip :

from pyspark.sql.types import ArrayType, StringType, StructType, StructField
df = df.withColumn("variants", F.arrays_zip("variants.admin_graphql_api_id", "variants.compare_at_price"))
df = df.withColumn("variants", F.col("variants").cast(schema))
df.printSchema()

печатает

root
 |-- variants: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- admin_graphql_api_id: string (nullable = true)
 |    |    |-- compare_at_price: string (nullable = true)

Второй withColumn необходим для установки имен полей новой структуры.


arrays_zip доступен только для версии Spark> = 2.4.0. Если вы используете старую версию Spark, вы можете использовать UDF:
def func(array):
    return [[x.admin_graphql_api_id, x.compare_at_price] for x in array]
func_udf = F.udf(func, schema)
df = df.withColumn("variants", func_udf("variants"))
...