【发布时间】:2018-07-27 19:12:47
【问题描述】:
我正在开发基于一组 ORC 文件的 spark 数据帧的 sql 查询。程序是这样的:
from pyspark.sql import SparkSession
spark_session = SparkSession.builder.appName("test").getOrCreate()
sdf = spark_session.read.orc("../data/")
sdf.createOrReplaceTempView("test")
现在我有一个名为“test”的表。如果我这样做:
spark_session.sql("select count(*) from test")
那么结果会很好。但我需要在查询中获取更多列,包括数组中的一些字段。
In [8]: sdf.take(1)[0]["person"]
Out[8]:
[Row(name='name', value='tom'),
Row(name='age', value='20'),
Row(name='gender', value='m')]
我尝试过类似的方法:
spark_session.sql("select person.age, count(*) from test group by person.age")
但这不起作用。我的问题是:如何访问“person”数组中的字段?
谢谢!
编辑:
sdf.printSchema() 的结果
In [3]: sdf.printSchema()
root
|-- person: integer (nullable = true)
|-- customtags: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- name: string (nullable = true)
| | |-- value: string (nullable = true)
错误信息:
AnalysisException: 'No such struct field age in name, value; line 16 pos 8'
【问题讨论】:
-
df=spark.sql(select * from test);func=udf(lambda x: x['age'],IntegerType()); df.withColumns('age',func(df.person)).groupby('age').count().show()
标签: pyspark pyspark-sql orc