“explode”函数和运算符有什么区别?

12

explode函数和explode操作符有什么区别?

2个回答

12

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):

已弃用(自2.0.0版本起),请改用带有functions.explode()flatMap()select()

请参阅Dataset API如何使用类型化数据集将多值列拆分为单独行的示例?

尽管explode已被弃用(我们可以将主题转换为explode函数和flatMap运算符之间的区别),但两者的区别在于前者是一个函数,而后者是一个运算符。它们具有不同的签名,但可以产生相同的结果。这经常导致讨论什么更好,通常归结为个人偏好或编码风格。也可以说,flatMap(即explode运算符)更符合Scala风格,因为在Scala编程中,flatMap非常普遍(主要隐藏在for-comprehension背后)。

1
你所说的运算符是指什么?在Scala中并没有运算符,它们都是函数。 - Yuval Itzchakov
1
我在学习Spark时学到了这个术语,我注意到Hadoop开发人员使用“operator”这个术语来表示...嗯...用于开发Hadoop应用程序的运算符。我花了一些时间才适应这个术语,但我意识到我对Scala有偏见,并且认为在Spark支持的其他语言中使用方法或函数可能并不正确(比如Python、R甚至SQL)。 - Jacek Laskowski
4
我明白了。但是这个问题标记了“Scala”标签,所以我认为可能会令人困惑。也许你只想将它标记为apache-spark? - Yuval Itzchakov
你的意思是在Hadoop领域中,“operator”指的是“UDF”吗? - OneCricketeer
不完全是。只是一个从中组成应用程序的一般概念/计算(可以是方法、函数、UDF、过程或SQL子句等)。类似于SQL子句的高级别东西。 - Jacek Laskowski

1

相较于explode,flatMap在性能方面更加优越,因为flatMap需要的数据洗牌(data shuffle)要少得多。如果您正在处理大数据(>5 GB),性能差异将明显可见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接