apache-spark - 之后如何使用键取消嵌套数组以加入?

标签 apache-spark hive apache-spark-sql hiveql

我有两张表,即table1table2 . table1很大,而 table2是小。另外,我有一个 UDF 函数,其接口(interface)定义如下:

--table1--
id
1
2
3

--table2--
category
a
b
c
d
e
f
g

UDF: foo(id: Int): List[String]

我打算先调用UDF获取对应的分类:foo(table1.id) ,它将返回一个 WrappedArray,然后我想加入每个 categorytable2做一些更多的操作。预期结果应如下所示:
--view--

id,category
1,a
1,c
1,d
2,b
2,c
3,e
3,f
3,g

我试图在 Hive 中找到一种 unnest 方法,但没有运气,有人可以帮我吗?谢谢!

最佳答案

相信你想用explode function或数据集的 flatMap operator .
explode函数为给定数组或映射列中的每个元素创建一个新行。
flatMap运算符首先将一个函数应用于此数据集的所有元素,然后将结果展平,从而返回一个新的数据集。

执行 UDF 后 foo(id: Int): List[String]你最终会得到一个 Dataset类型为 array 的列.

val fooUDF = udf { id: Int => ('a' to ('a'.toInt + id).toChar).map(_.toString) }

// table1 with fooUDF applied
val table1 = spark.range(3).withColumn("foo", fooUDF('id))

scala> table1.show
+---+---------+
| id|      foo|
+---+---------+
|  0|      [a]|
|  1|   [a, b]|
|  2|[a, b, c]|
+---+---------+

scala> table1.printSchema
root
 |-- id: long (nullable = false)
 |-- foo: array (nullable = true)
 |    |-- element: string (containsNull = true)

scala> table1.withColumn("fooExploded", explode($"foo")).show
+---+---------+-----------+
| id|      foo|fooExploded|
+---+---------+-----------+
|  0|      [a]|          a|
|  1|   [a, b]|          a|
|  1|   [a, b]|          b|
|  2|[a, b, c]|          a|
|  2|[a, b, c]|          b|
|  2|[a, b, c]|          c|
+---+---------+-----------+

有了这个,join应该很容易。

关于apache-spark - 之后如何使用键取消嵌套数组以加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411832/

相关文章:

apache-spark - Spark SQL + Window + Streaming 问题 - 使用 Spark 流运行时,Spark SQL 查询需要很长时间才能执行

hadoop - hive 在本地存储表的位置?

mysql - 我们可以使用 sqoop 导出特殊字符吗?

apache-spark - Spark Dataframe中的reducebykey和aggregatebykey

hadoop - 如何将 Parquet 文件转换为 Avro 文件?

hadoop - 加入Spark太慢了。有什么办法可以优化吗?

security - 保护 Apache Spark

json - hive 中的JSON解析问题

python - 断言错误 : col should be Column

apache-spark - 在 Spark-SQL Shell 中设置配置值