如何在Scala DataFrame中拆分两个数组列?
问题解决思路
你这么写会触发笛卡尔积:先拆分subject数组得到多行,再对每行的mark数组二次拆分,结果就是每个subject和所有mark强制配对,所以会生成重复的4行数据。
要实现subject和mark按原数组位置一一对应拆分,用下面两种方法即可:
方案1:数组打包后统一拆分
先通过arrays_zip把subject和mark按索引位置打包成结构体数组,再一次性拆分:
df.withColumn("subject_mark", arrays_zip($"subject", $"mark")) .withColumn("subject_mark", explode($"subject_mark")) .select($"subject_mark.subject", $"subject_mark.mark")
方案2:按索引关联拆分
先对subject带索引拆分,再通过索引提取mark数组对应位置的元素:
df.withColumn("pos_subject", posexplode($"subject")) .withColumn("mark", element_at($"mark", $"pos")) .select($"col".alias("subject"), $"mark")
这两种方式都能保证subject和mark与原数组的位置完全对应,不会出现乱配对的情况。
内容的提问来源于stack exchange,提问作者Shankar Panda
相关产品推荐
相关产品推荐

