apache-spark - 访问结构属性的怪癖 - 可以通过索引而不是名称访问属性
问题描述
在向数据框添加一列(结构数组)后,我想在这个添加的列上运行 UDF。现在,我无法通过名称访问结构的属性,但可以通过索引访问它们。
但是,如果我缓存数据框,那么按属性名称访问就会开始工作。
这是可重现的代码:
import pyspark.sql.functions as spf
import pyspark.sql.types as spt
df = spark.createDataFrame([{"something": 1}])
tuple_schema = spt.ArrayType(
elementType=spt.StructType([spt.StructField("x", spt.FloatType()),
spt.StructField("y", spt.FloatType())]))
def generate_tuples():
return [(3.0, 4.0)]
tuple_udf = spf.udf(generate_tuples, tuple_schema)
df = df.withColumn("our_tuples", tuple_udf())
df.collect()
# [Row(something=1, our_tuples=[Row(x=3.0, y=4.0)])]
index_udf = spf.udf(lambda lst: max([z[1] for z in lst]) \
if len(lst) > 0 else 0.0, spt.FloatType())
attribute_udf = spf.udf(lambda lst: max([z.y for z in lst]) \
if len(lst) > 0 else 0.0, spt.FloatType())
这有效:✔️
index_df = df.withColumn("m", index_udf(df.our_tuples))
index_df.collect()
这不起作用:❌</p>
attribute_df = df.withColumn("m", attribute_udf(df.our_tuples))
attribute_df.collect()
# AttributeError: 'tuple' object has no attribute 'y'
这再次有效:✔️
df.cache()
df.count()
attribute_df = df.withColumn("m", attribute_udf(df.our_tuples))
attribute_df.collect()
这是 Spark 错误,还是我不知道的预期行为?
解决方案
推荐阅读
- directx - DirectX 什么是 CounterResource?
- java - 部分响应的 HTTP 状态代码应该是什么?
- ios - ScrollView中的SwiftUI文本,无法在两个轴上滚动
- amazon-web-services - 获取所有 aws 资源的所有者电子邮件
- php - 正则表达式 - 从列表中的字符串中获取不同的字符
- python - 列表中所有对的乘积之和
- android - 将图像下载器添加到颤振应用程序时出错
- xml - 如何在 XSLT 转换中对结果进行排序?
- amazon-web-services - 使用报告 AWS API Gateway
- javascript - 为什么我无法访问 getDerivedStateFromProps() 中的静态属性