【发布时间】:2017-06-01 13:38:34
【问题描述】:
我有一个名为 Link 的 DataFrame,在 Row 中有动态数量的字段/列。
然而,一些字段的结构 [ClassName]Id 包含一个 id
[ClassName]Id 的类型始终为 String
我有几个Datasets,每个都有不同的类型[ClassName]
每个Dataset至少有id(String)和typeName(String)这两个字段,总是用[ClassName]的String值填充
例如如果我有 3 个 A、B 和 C
类型的DataSets
链接:
+----+-----+-----+-----+
| id | AId | BId | CId |
+----+-----+-----+-----+
| XX | A01 | B02 | C04 |
| XY | null| B05 | C07 |
答:
+-----+----------+-----+-----+
| id | typeName | ... | ... |
+-----+----------+-----+-----+
| A01 | A | ... | ... |
乙:
+-----+----------+-----+-----+
| id | typeName | ... | ... |
+-----+----------+-----+-----+
| B02 | B | ... | ... |
首选的最终结果是 Link Dataframe,其中每个 Id 都被一个名为 [ClassName] 的字段替换或附加,并封装了原始对象。
结果:
+----+----------------+----------------+----------------+
| id | A | B | C |
+----+----------------+----------------+----------------+
| XX | A(A01, A, ...) | B(B02, B, ...) | C(C04, C, ...) |
| XY | null | B(B05, B, ...) | C(C07, C, ...) |
我尝试过的事情
-
对 joinWith 的递归调用。
第一次调用成功返回一个元组/
Row,其中第一个元素是原始的Row,第二个是匹配的[ClassName]然而,第二次迭代开始嵌套这些结果。 尝试使用 map 'unnest' 这些结果要么导致编码器地狱(因为生成的Row不是固定类型),要么编码非常复杂以至于它导致催化剂 error - 以 RDD 身份加入还不能解决这个问题。
欢迎提出任何想法。
【问题讨论】:
-
我不确定我是否明白你的问题。您是否愿意对其进行审查,以便我们尝试提供帮助?
标签: apache-spark apache-spark-sql rdd apache-spark-dataset