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)
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |