爆炸函数和运算符之间有什么区别?

时间:2017-04-24 08:15:05

标签: apache-spark apache-spark-sql

explode函数和explode运算符之间有什么区别?

2 个答案:

答案 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 APIHow 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),则可以明显看出性能差异。