【问题标题】:How to join nested columns in spark with usingColumns如何使用 usingColumns 在 Spark 中加入嵌套列
【发布时间】:2019-01-31 11:03:20
【问题描述】:

我想加入 2 个数据框。

DF1:

root
 |-- myStruct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- region: long (nullable = true)
 |-- first_name: string (nullable = true)

DF2:

root
 |-- id: string (nullable = true)
 |-- region: long (nullable = true)
 |-- second_name: string (nullable = true)

我的加入声明是

df1.join(df2, Seq("id", "region"), "leftouter")

但是失败了

USING column `id` cannot be resolved on the left side of the join. The left-side columns: myStruct, first_name

我在 Scala 上运行 Spark 2.2

【问题讨论】:

    标签: apache-spark join apache-spark-sql


    【解决方案1】:

    这是因为在 DF1 中,id 是列 myStruct 的一个元素,该列是 struct 类型。为了加入,您可以执行以下操作,

    val df = df1
    .withColumn("id", col("myStruct.id"))
    .withColumn("region", col("myStruct.region"))
    
    df.join(df2, Seq("id", "region"), "leftouter")
    

    这实质上是从结构列中提取idregion

    【讨论】:

      【解决方案2】:

      您可以使用. 表示法从struct 列中选择一个元素。所以要从df1中选择id,你必须使用myStruct.id,而要选择region,你必须使用myStruct.region

      并且由于要使用的列名不同您可以使用===符号进行比较

      df1.join(df2, df1("myStruct.id") === df2("id") && df1("myStruct.region") === df2("region"), "leftouter")
      

      你应该有加入 dataframe 与以下 schema

      root
       |-- myStruct: struct (nullable = true)
       |    |-- id: string (nullable = true)
       |    |-- region: long (nullable = false)
       |-- first_name: string (nullable = true)
       |-- id: string (nullable = true)
       |-- region: integer (nullable = true)
       |-- second_name: string (nullable = true)
      

      您可以删除加入后不需要的列或选择加入后只需要的列

      希望回答对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多