explode
函数和explode
运算符之间有什么区别?
答案 0 :(得分:10)
spark.sql.functions.explode
explode
函数为给定数组或地图列(在DataFrame中)中的每个元素创建一个新行。
val signals: DataFrame = spark.read.json(signalsJson)
signals.withColumn("element", explode($"data.datapayload"))
explode
创建Column。
请参阅functions对象和How to unwind array in DataFrame (from JSON)?
中的示例Dataset<Row> explode
/ flatMap
运算符(方法) explode
运算符几乎 explode
函数。
来自scaladoc:
explode
返回一个新的数据集,其中单个列已被提供的函数扩展为零行或多行。这类似于HiveQL中的LATERAL VIEW。输入行的所有列都与函数输出的每个值隐式连接。
ds.flatMap(_.words.split(" "))
请注意(再次引用scaladoc):
已弃用(自2.0.0版开始)使用
flatMap()
或select()
代替functions.explode()
请参阅Dataset API和How to split multi-value column into separate rows using typed Dataset?
中的示例尽管explode
被弃用(我们可以将主要问题转换为explode
函数和flatMap
运算符之间的差异),但区别在于前者是函数而后者是一个运营商。它们具有不同的签名,但可以给出相同的结果。这往往导致讨论更好,通常归结为个人偏好或编码风格。
考虑到Scala编程中普遍存在的flatMap
(主要隐藏在for-comprehension后面),人们还可以说explode
(即flatMap
运算符)更多Scala-ish。
答案 1 :(得分:1)
flatMap 在性能上比爆炸要好得多,因为 flatMap 需要更少的数据洗牌。 如果您正在处理大数据(>5 GB),则可以明显看出性能差异。