我有两个标签分隔的数据文件,如下所示:
文件1:
number type data_present
1 a yes
2 b no
文件2:
type group number recorded
d aa 10 true
c cc 20 false
我想合并这两个文件,以便输出文件如下所示:
number type data_present group recorded
1 a yes NULL NULL
2 b no NULL NULL
10 d NULL aa true
20 cc NULL cc false
正如您所看到的,对于其他文件中不存在的列,我将这些地方填充为NULL。
关于如何在Scala / Spark中执行此操作的任何想法?
答案 0 :(得分:2)
这将为您提供所需的输出:
val output = file1.join(file2, Seq("number","type"), "outer")
答案 1 :(得分:1)
为您的数据集创建两个文件:
$ cat file1.csv
number type data_present
1 a yes
2 b no
$ cat file2.csv
type group number recorded
d aa 10 true
c cc 20 false
将它们转换为CSV:
$ sed -e 's/^[ \t]*//' file1.csv | tr -s ' ' | tr ' ' ',' > f1.csv
$ sed -e 's/^[ ]*//' file2.csv | tr -s ' ' | tr ' ' ',' > f2.csv
使用spark-csv模块将CSV文件作为数据框加载:
$ spark-shell --packages com.databricks:spark-csv_2.10:1.1.0
import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)
val df1 = sqlContext.load("com.databricks.spark.csv", Map("path" -> "f1.csv", "header" -> "true"))
val df2 = sqlContext.load("com.databricks.spark.csv", Map("path" -> "f2.csv", "header" -> "true"))
现在执行连接:
scala> df1.join(df2, df1("number") <=> df2("number") && df1("type") <=> df2("type"), "outer").show()
+------+----+------------+----+-----+------+--------+
|number|type|data_present|type|group|number|recorded|
+------+----+------------+----+-----+------+--------+
| 1| a| yes|null| null| null| null|
| 2| b| no|null| null| null| null|
| null|null| null| d| aa| 10| true|
| null|null| null| c| cc| 20| false|
+------+----+------------+----+-----+------+--------+
答案 2 :(得分:0)
将所有列简单转换为String,而不是将两个DF转换为联合。