【问题标题】:How to compare two files using spark?如何使用火花比较两个文件?
【发布时间】:2017-01-23 22:24:07
【问题描述】:

如果不匹配的额外记录加载到具有不匹配记录的另一个文件中,我想比较两个文件。 比较文件中的每个字段和记录数。

【问题讨论】:

  • 文件的结构是什么?
  • CSV 格式
  • 它们是什么架构?什么是比较列?有什么限制吗?

标签: scala apache-spark hadoop2 hadoop-streaming bigdata


【解决方案1】:

假设您有两个文件:

scala> val a = spark.read.option("header", "true").csv("a.csv").alias("a"); a.show
+---+-----+
|key|value|
+---+-----+
|  a|    b|
|  b|    c|
+---+-----+

a: org.apache.spark.sql.DataFrame = [key: string, value: string]

scala> val b = spark.read.option("header", "true").csv("b.csv").alias("b"); b.show
+---+-----+
|key|value|
+---+-----+
|  b|    c|
|  c|    d|
+---+-----+

b: org.apache.spark.sql.DataFrame = [key: string, value: string]

目前尚不清楚您要查找哪种类型的不匹配记录,但使用join 的任何定义都很容易找到它们:

scala> a.join(b, Seq("key")).show
+---+-----+-----+
|key|value|value|
+---+-----+-----+
|  b|    c|    c|
+---+-----+-----+

scala> a.join(b, Seq("key"), "left_outer").show
+---+-----+-----+
|key|value|value|
+---+-----+-----+
|  a|    b| null|
|  b|    c|    c|
+---+-----+-----+

scala> a.join(b, Seq("key"), "right_outer").show
+---+-----+-----+
|key|value|value|
+---+-----+-----+
|  b|    c|    c|
|  c| null|    d|
+---+-----+-----+

scala> a.join(b, Seq("key"), "outer").show
+---+-----+-----+
|key|value|value|
+---+-----+-----+
|  c| null|    d|
|  b|    c|    c|
|  a|    b| null|
+---+-----+-----+

如果您正在寻找b.csv 中不存在于a.csv 中的记录:

scala> val diff = a.join(b, Seq("key"), "right_outer").filter($"a.value" isNull).drop($"a.value")
scala> diff.show
+---+-----+
|key|value|
+---+-----+
|  c|    d|
+---+-----+

scala> diff.write.csv("diff.csv")

【讨论】:

  • 感谢丹尼尔的回复,对我很有帮助。
猜你喜欢
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多