爆炸功能和操作员之间有什么区别?

Jac*_*ski 11 apache-spark apache-spark-sql

explode功能和explode操作员之间有什么区别?

Jac*_*ski 11

spark.sql.functions.explode

explode 函数为给定数组或映射列(在DataFrame中)中的每个元素创建一个新行.

val signals: DataFrame = spark.read.json(signalsJson)
signals.withColumn("element", explode($"data.datapayload"))
Run Code Online (Sandbox Code Playgroud)

explode创建一个.

请参阅函数对象和如何在DataFrame中展开数组(来自JSON)中的示例?

Dataset<Row> explode/ flatMapoperator(方法)

explode操作员几乎explode功能.

来自scaladoc:

explode返回一个新的数据集,其中单个列已被提供的函数扩展为零或更多行.这类似于HiveQL中的LATERAL VIEW.输入行的所有列都与函数输出的每个值隐式连接.

ds.flatMap(_.words.split(" "))
Run Code Online (Sandbox Code Playgroud)

请注意(再次引用scaladoc):

不推荐使用(自版本2.0.0)使用flatMap()select()functions.explode()替代

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


尽管explode被弃用(我们可以将主要问题转换为explode函数和flatMap运算符之间的差异),但不同之处在于前者是函数而后者是运算符.它们具有不同的签名,但可以给出相同的结果.这往往导致讨论更好,通常归结为个人偏好或编码风格.

人们也可以说flatMap(即explode运算符)更多的是Scala-ish,因为flatMapScala编程中普遍存在(主要隐藏在for-comprehension之后).

  • 我知道了.但是这个问题用"Scala"标签标记,所以我认为这可能令人困惑.也许你只想把它标记为apache-spark? (4认同)