【问题标题】:How to remove array element in PySpark dataframe?如何删除 PySpark 数据框中的数组元素?
【发布时间】:2020-10-06 10:34:04
【问题描述】:

我想从这个数组中删除条形码。

我的数据框看起来像下面给出的示例,

|-- 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 从数据框中删除元素吗?

【问题讨论】:

  • 当你删除element时,你最终不会得到一个空数组吗?
  • 不,我只想要 admin_graphql_api_id 和 compare_at_price
  • 对不起,我的错。我没看到你帖子的第一行
  • 没有问题@werner

标签: python-3.x dataframe apache-spark pyspark apache-spark-sql


【解决方案1】:

你可以使用arrays_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"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2020-07-31
    • 2021-01-01
    • 2012-03-29
    相关资源
    最近更新 更多