python - 如何在 PySpark 的 UDF 中返回 "Tuple type"?

标签 python apache-spark dataframe pyspark apache-spark-sql

所有 data types in pyspark.sql.types are :

__all__ = [
    "DataType", "NullType", "StringType", "BinaryType", "BooleanType", "DateType",
    "TimestampType", "DecimalType", "DoubleType", "FloatType", "ByteType", "IntegerType",
    "LongType", "ShortType", "ArrayType", "MapType", "StructField", "StructType"]

我必须编写一个返回元组数组的 UDF(在 pyspark 中)。我给它的第二个参数是什么,它是 udf 方法的返回类型?这将类似于 ArrayType(TupleType())...

最佳答案

Spark 中没有 TupleType 这样的东西。产品类型表示为具有特定类型字段的结构。例如,如果你想返回一个数组对(整数,字符串),你可以使用这样的模式:

from pyspark.sql.types import *

schema = ArrayType(StructType([
    StructField("char", StringType(), False),
    StructField("count", IntegerType(), False)
]))

示例用法:

from pyspark.sql.functions import udf
from collections import Counter

char_count_udf = udf(
    lambda s: Counter(s).most_common(),
    schema
)

df = sc.parallelize([(1, "foo"), (2, "bar")]).toDF(["id", "value"])

df.select("*", char_count_udf(df["value"])).show(2, False)

## +---+-----+-------------------------+
## |id |value|PythonUDF#<lambda>(value)|
## +---+-----+-------------------------+
## |1  |foo  |[[o,2], [f,1]]           |
## |2  |bar  |[[r,1], [a,1], [b,1]]    |
## +---+-----+-------------------------+

关于python - 如何在 PySpark 的 UDF 中返回 "Tuple type"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840563/

相关文章:

python - 在列表中查找较小列表的确切位置(python)

Javascript+Python : sending array to Python script, 将结果返回给 Javascript

python - 如何将 xgboost 集成到 Spark 中? (Python)

r - 转换多个列类

python - 如何更改 matplotlib 中多个绘图的默认颜色?

python - 使用 get_inline_instances 覆盖添加权限?

python - Pandas:改进运行时间循环遍历包含子字符串的字符串

python - Pandas - 根据唯一值和不同的列日期时间过滤 DataFrame

apache-spark - Zeppelin 0.8.2 - localRepoPath 应该有一个值

scala - 如何对数组列的元素进行切片和求和?