基于不同类型spark 1.6列的Spark join dataframe

Posted

技术标签:

【中文标题】基于不同类型spark 1.6列的Spark join dataframe【英文标题】:Spark join dataframe based on column of different type spark 1.6 【发布时间】:2020-06-18 16:44:20 【问题描述】:

我有 2 个数据框 df1 和 df2 。我将根据列col1col2 同时加入 df1 和 df2。然而,col1 的数据类型是 string in df1,col2 的类型是 int in df2。当我尝试像下面这样加入时,

val df3 = df1.join(df2,df1("col1") === df2("col2"),inner).select(df2("col2"))

连接不起作用并返回空数据类型。在df2中不改变col2的类型是否可以获得正确的输出

【问题讨论】:

看起来你有一个有效的答案 @VB_ :表示这是一个有效的场景吗? 我的意思是@_mvasyliv 提供了一个可行的解决方案恕我直言 【参考方案1】:
  val dDF1 = List("1", "2", "3").toDF("col1")
  val dDF2 = List(1, 2).toDF("col2")

  val res1DF = dDF1.join(dDF2, dDF1.col("col1") === dDF2.col("col2").cast("string"), "inner")
      .select(dDF2.col("col2"))
  res1DF.printSchema()
  res1DF.show(false)
  //      root
  //      |-- col2: integer (nullable = false)
  //
  //      +----+
  //      |col2|
  //      +----+
  //      |1   |
  //      |2   |
  //      +----+

获取架构数据帧

val sch1 = dDF1.schema
sch1: org.apache.spark.sql.types.StructType = StructType(StructField(col1,StringType,true))
// public StructField(String name,
//               DataType dataType,
//               boolean nullable,
//               Metadata metadata)

【讨论】:

如果有多个连接列,我如何更改类型? @techie 您可以从dDF1 动态选择架构并动态转换列

以上是关于基于不同类型spark 1.6列的Spark join dataframe的主要内容,如果未能解决你的问题,请参考以下文章

Spark DataSet 过滤器性能

Spark 2.0 将 json 读入带有引号的数据帧中 - 与 spark 1.6 不同的行为......错误?

在 spark 1.6 中计数(不同)不能与 hivecontext 查询一起使用

Spark 1.6 RPC内幕解密:运行机制源码详解Netty与Akka等(DT大数据梦工厂)

Spark 1.6以后的内存管理机制

Spark 1.6以空值爆炸[重复]