将wrappedarray元素折叠到不同的列中

时间:2017-06-12 17:59:49

标签: python scala apache-spark pyspark

我有一个spark数据帧,这里是架构:

|-- eid: long (nullable = true)
|-- age: long (nullable = true)
|-- sex: long (nullable = true)
|-- father: array (nullable = true)
|    |-- element: array (containsNull = true)
|    |    |-- element: long (containsNull = true)

和行样本:。

df.select(df['father']).show()
+--------------------+
|              father|
+--------------------+
|[WrappedArray(-17...|
|[WrappedArray(-11...|
|[WrappedArray(13,...|
+--------------------+

,类型是

DataFrame[father: array<array<bigint>>]

我想要的是折叠father列,例如,如果13是此数组的成员,则创建一个新列并返回1,否则返回0 这是我尝试的第一件事:

def modify_values(r):
    if 13 in r:
        return 1
    else:
        return 0

my_udf = udf(modify_values, IntegerType())
df.withColumn("new_col",my_udf(df['father'].getItem(0))).show()

并返回此错误:

Py4JJavaError: An error occurred while calling o817.showString.
TypeError: argument of type 'NoneType' is not iterable

然后我尝试了这个:

df.withColumn("new_col", F.when(1 in df["father"].getItem(0), 1).otherwise(0))

抱怨是:

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

1 个答案:

答案 0 :(得分:1)

查看schema的{​​{1}},dataframewhen函数的简单组合可以解决您的问题

array_contains

如果您仍想尝试使用df.withColumn("new_col", when(array_contains($"father"(0), 13), 1).otherwise(0)).show(false) 功能,这种方法比上述方式更慢,您应该更改udf功能,如下所示

udf

我希望这个答案可以解决您的所有问题