左反加入Spark?

2024-05-01

我定义了两个表,如下所示:

 val tableName = "table1"
    val tableName2 = "table2"

    val format = new SimpleDateFormat("yyyy-MM-dd")
      val data = List(
        List("mike", 26, true),
        List("susan", 26, false),
        List("john", 33, true)
      )
    val data2 = List(
        List("mike", "grade1", 45, "baseball", new java.sql.Date(format.parse("1957-12-10").getTime)),
        List("john", "grade2", 33, "soccer", new java.sql.Date(format.parse("1978-06-07").getTime)),
        List("john", "grade2", 32, "golf", new java.sql.Date(format.parse("1978-06-07").getTime)),
        List("mike", "grade2", 26, "basketball", new java.sql.Date(format.parse("1978-06-07").getTime)),
        List("lena", "grade2", 23, "baseball", new java.sql.Date(format.parse("1978-06-07").getTime))
      )

      val rdd = sparkContext.parallelize(data).map(Row.fromSeq(_))
      val rdd2 = sparkContext.parallelize(data2).map(Row.fromSeq(_))
      val schema = StructType(Array(
        StructField("name", StringType, true),
        StructField("age", IntegerType, true),
        StructField("isBoy", BooleanType, false)
      ))
    val schema2 = StructType(Array(
        StructField("name", StringType, true),
        StructField("grade", StringType, true),
        StructField("howold", IntegerType, true),
        StructField("hobby", StringType, true),
        StructField("birthday", DateType, false)
      ))

      val df = sqlContext.createDataFrame(rdd, schema)
      val df2 = sqlContext.createDataFrame(rdd2, schema2)
      df.createOrReplaceTempView(tableName)
      df2.createOrReplaceTempView(tableName2)

我正在尝试构建查询以返回 table1 中的行,而 table2 中没有匹配的行。 我尝试使用以下查询来做到这一点:

Select * from table1 LEFT JOIN table2 ON table1.name = table2.name AND table1.age = table2.howold AND table2.name IS NULL AND table2.howold IS NULL

但这只给了我 table1 中的所有行:

列表({“姓名”:“约翰”,“年龄”:33,“isBoy”:true}, {"姓名":"苏珊","年龄":26,"i​​sBoy":false}, {“姓名”:“迈克”,“年龄”:26,“isBoy”:true})

如何在 Spark 中高效地进行这种类型的连接?

我正在寻找 SQL 查询,因为我需要能够指定要在两个表之间进行比较的列,而不仅仅是像其他推荐问题中那样逐行比较。就像使用减法一样,除了等等。


您可以使用“左反”连接类型 - 无论是使用 DataFrame API 还是使用 SQL(DataFrame API 支持 SQL 支持的所有内容,包括您需要的任何连接条件):

数据帧API:

df.as("table1").join(
  df2.as("table2"),
  $"table1.name" === $"table2.name" && $"table1.age" === $"table2.howold",
  "leftanti"
)

SQL:

sqlContext.sql(
  """SELECT table1.* FROM table1
    | LEFT ANTI JOIN table2
    | ON table1.name = table2.name AND table1.age = table2.howold
  """.stripMargin)

NOTE:还值得注意的是,有一种更短、更简洁的方法来创建示例数据,而无需单独指定模式,使用元组和隐式toDF方法,然后在需要时“修复”自动推断的模式:

import spark.implicits._
val df = List(
  ("mike", 26, true),
  ("susan", 26, false),
  ("john", 33, true)
).toDF("name", "age", "isBoy")

val df2 = List(
  ("mike", "grade1", 45, "baseball", new java.sql.Date(format.parse("1957-12-10").getTime)),
  ("john", "grade2", 33, "soccer", new java.sql.Date(format.parse("1978-06-07").getTime)),
  ("john", "grade2", 32, "golf", new java.sql.Date(format.parse("1978-06-07").getTime)),
  ("mike", "grade2", 26, "basketball", new java.sql.Date(format.parse("1978-06-07").getTime)),
  ("lena", "grade2", 23, "baseball", new java.sql.Date(format.parse("1978-06-07").getTime))
).toDF("name", "grade", "howold", "hobby", "birthday").withColumn("birthday", $"birthday".cast(DateType))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

左反加入Spark? 的相关文章

随机推荐

  • CKAsset 不会显示在表格视图图像中

    我在 cloudkit DB 中有一个可选图像 已检查数据库 并且在我在测试中添加它的情况下该图像就在那里 我创建了一个类 它将记录字段初始化为我在表视图中使用的变量 我也有一个定制单元 但图像不会显示在我的自定义表格视图单元格中 我不知道
  • 启用JConsole远程监控是否会影响生产中的系统性能?

    Oracle Sun 说只要不在生产环境中本地运行就可以吗 http download oracle com javase 1 5 0 docs guide management jconsole html http download or
  • 如何用 C# 实现自己的 TaS-Lock?

    因此 对于分配 我们需要选择使用 C Lock 或使用自行实现的 TaS Lock 我读到的有关 TaS Locks 的内容是 它使用 1 个原子步骤来读取和写入一个值 有人建议我们为此使用 C 中的 Interlocked 类 到目前为止
  • ASP.NET MaskedEditExtender 和 TextBox:无法输入零,解决方法吗?解决方案?

    我正在尝试在连接到 MaskedEditExtender 的文本框中输入 0 我的掩码设置为 NUMBER 13 2 其中 9999999999999 99 作为我的十进制掩码 问题是用户必须输入一个数字 该值可以为0 我测试了多次尝试尝试
  • 字符串中的换行符未写入文件

    我正在尝试编写一个程序来操作从文件中读取的 unicode 字符串 我想到了两种方法 一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其写回另一个文件 另一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其
  • 如何在 Android Studio 中显示丰富的布局编辑器? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何显示或使用 Android Studio 中讨论的丰富布局编辑器 更多信息我是 Java 新手 刚刚下载了 Android Studio 并创建了
  • CSS“Shrinkwrap”方法如何与 max-width 一起使用并且没有 BR 换行标记?

    我正在尝试创建一个最大宽度边界框 它将包裹文本 在空格上 不允许断字 并收缩到最长文本行的宽度 有关各种收缩包裹方法的演示 请参见http www brunildo org test IEMshrink to fit html http w
  • Android SQLite 通配符

    我正在尝试使用通配符元素进行查询 以在 SQLite 表中搜索特定变量中任意位置具有元素的条目 public String getCheckoutEntry String title String ISBN Wild card Syntax
  • 在哪里可以找到 Fluent NHibernate 教程?

    我用谷歌搜索并环顾四周 是否有人知道任何隐藏的宝石不在谷歌搜索的前几页中 The wiki https github com jagregory fluent nhibernate wiki 是你最好的选择 我有过几个流畅的 NHibern
  • 骆驼:我如何异步发送到端点

    如何在不等待端点的路由被处理的情况下向端点发送消息 也就是说 我的路由应该只分派消息并完成 wireTap endpoint 就是答案
  • Fabric.js canvas.toDataURL() 通过 Ajax 发送到 PHP

    当我需要创建具有透明背景的图像时 我遇到了问题 我还是不知道问题出在fabricjs还是php 当我发送带有彩色背景的图像时 一切正常 当我发送具有透明背景的图像时会出现问题 生成的图像是用黑色背景创建的 那么 让我更好地解释一下 当用户单
  • 无法使用 Rails 3.2 创建插件?

    我在最新版本中遇到了 Rails 问题 我创建了一个新应用程序 rails new MyProject 但我没有脚本 生成 只有脚本 rails 当我输入时 ruby script rails generate plugin my plug
  • 调用多个ajax调用

    ajax url jsonpCallback item contentType application json dataType jsonp success function data console log data var marku
  • 为什么存储开销会在 C# 数据类型中产生浪费?

    在副主题中存储开销 关于章节 C 5 0 简而言之书上有这样一条一般性注释 现在 我想知道为什么 struct 中的字段A造成空间浪费 或者 作者整篇笔记的要点是什么 Each byte字段占用1个字节 而每个long字段占用8个字节 这意
  • FirebaseRemoteConfigClientException:Firebase 安装无法获取用于提取的安装身份验证令牌

    我遇到异常 com google firebase remoteconfig FirebaseRemoteConfigClientException Firebase Installations failed to get installa
  • 如何删除因缩小以适合元素而自动换行引起的额外空间?

    我正在尝试使用收缩来贴合 container 它可以完美地工作 直到它包含的元素换行为止 这会使其扩展到 180 像素 screen dimensions width 250px height 100px background color
  • 串流期货列表的最有效方式

    我通过流式传输对象列表来调用异步客户端方法 该方法返回 Future 迭代调用后返回的 Future 列表的最佳方法是什么 以便处理先出现的 Future 注意 异步客户端仅返回 Future 而不返回 CompletableFuture
  • 如何获取ISP名称?

    如何在 Salesforce com 中捕获用户的 ISP 名称 该解决方案可以采用 Salesforce com 中的 JavaScript 例如 Apex VisualForce Pages 捕获用户 ISP 名称的网站示例是 http
  • 如何调试 Python 日志记录配置文件错误

    我已将 Python 的日志记录模块添加到我的代码中 以避免混乱的打印语句 但我却因配置错误而陷入困境 错误消息的信息不是很丰富 Traceback most recent call last File HDAudioSync py lin
  • 左反加入Spark?

    我定义了两个表 如下所示 val tableName table1 val tableName2 table2 val format new SimpleDateFormat yyyy MM dd val data List List mi