是否可以在 PySpark Dataframe 中定义递归 DataType?

Omi*_*mid 6 apache-spark apache-spark-sql pyspark

我想创建一个像这个例子这样的模式:

friendSchema = StructType([ \
    StructField("firstname",StringType(),True), \
    StructField("middlename",StringType(),True), \
    StructField("friends",**friendSchema**,True)
Run Code Online (Sandbox Code Playgroud)

我知道数据必须标准化,但我想知道 Spark 是否具有创建如上所述的模式的功能。如果可以的话,怎样才能做到呢?使用UDT可行吗?

小智 8

是的,这是可能的。您想要做的事情称为嵌套结构。模式StructType本身可以包含StructType字段,这将执行您想要的操作。例如:

def test_build_nested_schema(self):
    internal_struct = StructType([(StructField("friend_struct", StringType()))])
    friend_schema = StructType([
        StructField("firstname", StringType(), True),
        StructField("middlename", StringType(), True),
        StructField("friends", internal_struct, True)])
    empty_df = self.spark.createDataFrame([], schema=friend_schema)
    empty_df.printSchema()
Run Code Online (Sandbox Code Playgroud)

这将输出:

root
 |-- firstname: string (nullable = true)
 |-- middlename: string (nullable = true)
 |-- friends: struct (nullable = true)
 |    |-- friend_struct: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

文档链接


小智 1

你所要求的是不可能的。您想要做的是一个具有无限子模式的模式。

可以使用递归函数来完成:

from pyspark.sql.types import *

def friendSchema(n):
    if n == 0:
        return StructType([ \
            StructField("firstname", StringType(), True), \
            StructField("middlename", StringType(), True)])
    else:
        return StructType([ \
            StructField("firstname", StringType(), True), \
            StructField("middlename", StringType(), True), \
            StructField("friends", friendSchema(n - 1))])
Run Code Online (Sandbox Code Playgroud)