我在scala中有一个case类case class TestDate (id: String, loginTime: java.sql.Date)
我创建了2个类型为TestDate的RDD
我想在loginTime列的值相等的两个rdd上做一个内连接。请查看下面的代码片段
firstRDD.toDF.registerTempTable("firstTable")
secondRDD.toDF.registerTempTable("secondTable")
val res = sqlContext.sql("select * from firstTable INNER JOIN secondTable on to_date(firstTable.loginTime) = to_date(secondTable.loginTime)")
我没有得到任何异常。但是我也没有得到正确的答案。它做了一个笛卡尔坐标,并在结果中生成了一些随机日期。
问题是由于创建日期对象时给出的格式错误。当格式被修正后,它工作得很好。
您可以尝试使用另一种方法:
val df1 = firstRDD.toDF
val df2 = secondRDD.toDF
val res = df1.join(df2, Seq("loginTime"))
如果不行,你可以尝试将日期转换为string:
val df1 = firstRDD.toDF.withColumn("loginTimeStr", col("loginTime").cast("string"))
val df2 = secondRDD.toDF.withColumn("loginTimeStr", col("loginTime").cast("string"))
val res = df1.join(df2, Seq("loginTimeStr"))
最后,也许问题是您还需要连接中的ID列?
val df1 = firstRDD.toDF
val df2 = secondRDD.toDF
val res = df1.join(df2, Seq("id", "loginTime"))