提问人:user2153235 提问时间:10/3/2023 最后编辑:user2153235 更新时间:10/5/2023 访问量:78
Spark 的数组/映射字段的“爆炸”如何是 SELECT 操作?
How is Spark's "exploding" of array/map fields a SELECT operation?
问:
我是 Python a Spark 的新手,目前正在解决这个问题
有关 Spark 对 DataFrame 的数组/映射字段的操作的教程。explode
基于第一部分 1(PySpark 分解数组或映射 列到行),非常直观。最小工作示例 DataFrame 在下面的附件中创建。架构和 DataFrame 表是:
>>> df.printSchema()
root
|-- name: string (nullable = true)
|-- knownLanguages: array (nullable = true)
| |-- element: string (containsNull = true)
|-- properties: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
>>> df.show(truncate=False)
+----------+-------------------+-----------------------------+
|name |knownLanguages |properties |
+----------+-------------------+-----------------------------+
|James |[Java, Scala] |{eye -> brown, hair -> black}|
|Michael |[Spark, Java, null]|{eye -> null, hair -> brown} |
|Robert |[CSharp, ] |{eye -> , hair -> red} |
|Washington|null |null |
|Jefferson |[1, 2] |{} |
+----------+-------------------+-----------------------------+
该功能如下图所示:explode
>>> df \
... .select(df.name,explode(df.knownLanguages)) \
... .show()
+---------+------+
|name |col |
+---------+------+
|James |Java |
|James |Scala |
|Michael |Spark |
|Michael |Java |
|Michael |null |
|Robert |CSharp|
|Robert | |
|Jefferson|1 |
|Jefferson|2 |
+---------+------+
该函数显示在 SELECT 查询的上下文中,
但是,我发现这非常不直观。SELECT 修剪掉行
并且从不增加数据框的高度。仅联接
可能会增加高度,但即使在那里,行的过滤也是
应用于笛卡尔连接 [1],因此仍然是
高度而不是增加。如果我错了,请纠正我,但是
上面的 SELECT 未应用于联接,因为它是作为
的方法。explode
DataFrame
df
我试图更好地了解如何通过后者的 SELECT
doc string: “投影一组表达式并返回一个新的
:class:“。投影是指选择列
表达式。我没有成功
试图深入了解上述代码如何适合 SELECTion
通过检查其内容:explode
DataFrame
explode
explode(df.knownLanguages) # Shows no columnar data
Out[114]: Column<'explode(knownLanguages)'>
后来,我发现无法检查列式数据
对象的内容,如此处所述。Column
原型返回一个对象,而 doc
string 说它“为给定的每个元素返回一个新行
数组或映射”。很难想象这样的专栏,因为没有
“给定数组或映射” -- 异构数组/映射的数量与
中有记录。explode
Column
DataFrame
df
即使我们接受该对象不包含这样的
列式数据,它是
有必要描绘这样一个专栏在概念上会是什么样子
为了了解 SELECT 的意义。
我想不出这样一列有意义的数据
SELECT 查询,因为无论列如何构造,它都将是
的高度与 不同。Column
explode
DataFrame
df
得出 explode()
不会产生任何列的结论是否正确
适合 SELECT 的投影/选择操作的表达式
作为应用的 DataFrame
df
,它只是 select()
方法的一个信号,通过复制
每个
按 $n_i$ 次记录 $i$,其中 $n_i$ 是
记录的数组/映射?
我刚刚开始找到可能绕过 Spark 的方法。但是,我预计,如果破坏了 SELECT 的预测/选择模型,则可能很难根据设计行为的知识来制作比教程中更复杂的查询。explode()
笔记
[1] SELECT过滤了笛卡尔连接的概念,当然, 不在执行中。这反映在早期 SQL 使用的事实中 WHERE 代替 ON。所有 WHERE 子句都是(概念上) 应用于笛卡尔连接。
附件:创建最小工作示例 DataFrame 表
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('pyspark-by-examples').getOrCreate()
arrayData = [
('James',['Java','Scala'],{'hair':'black','eye':'brown'}),
('Michael',['Spark','Java',None],{'hair':'brown','eye':None}),
('Robert',['CSharp',''],{'hair':'red','eye':''}),
('Washington',None,None),
('Jefferson',['1','2'],{})
]
df = spark.createDataFrame(data=arrayData, schema = ['name','knownLanguages','properties'])
答: 暂无答案
评论
explode
不是 select 操作,而是返回新列的列操作。如 doc - 中所示。您可以在 中使用它。所有这些都是投影,因为生成了新列。pyspark.sql.functions.explode(col: ColumnOrName) → pyspark.sql.column.Column
withColumn
df
explode()
df
explain()