explode
函数和explode
操作符有什么区别?
spark.sql.functions.explode
explode
函数会针对给定的数组或Map列,在DataFrame中为每个元素创建一行新记录。
val signals: DataFrame = spark.read.json(signalsJson)
signals.withColumn("element", explode($"data.datapayload"))
explode
创建一个Column。
请参阅functions对象以及如何展开DataFrame中的数组(来自JSON)的示例。
Dataset<Row> explode
/ flatMap
运算符(方法)explode
运算符几乎等同于explode
函数。
从Scaladoc中可以看出:
explode
返回一个新的数据集,其中一个列通过提供的函数扩展为零个或多个行。这类似于HiveQL中的LATERAL VIEW。输入行的所有列都会与函数输出的每个值隐式连接。
ds.flatMap(_.words.split(" "))
请注意(再次引用scaladoc):functions.explode()
的flatMap()
或select()
。explode
已被弃用(我们可以将主题转换为explode
函数和flatMap
运算符之间的区别),但两者的区别在于前者是一个函数,而后者是一个运算符。它们具有不同的签名,但可以产生相同的结果。这经常导致讨论什么更好,通常归结为个人偏好或编码风格。也可以说,flatMap
(即explode
运算符)更符合Scala风格,因为在Scala编程中,flatMap
非常普遍(主要隐藏在for-comprehension背后)。相较于explode,flatMap在性能方面更加优越,因为flatMap需要的数据洗牌(data shuffle)要少得多。如果您正在处理大数据(>5 GB),性能差异将明显可见。