我在scala中有一个case类 case class TestDate(id:String,loginTime:java.sql.Date)
我创建了两个类型为TestDate的RDD&#p>
我想在两个rdd上进行内连接,其中loginTime列的值相等。请在下面找到代码段,
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)")
我没有得到任何例外。但我也没有得到正确答案。 它会生成一个笛卡尔,并在结果中生成一些随机日期。
答案 0 :(得分:1)
问题是由于在创建日期对象时给出了错误的格式。格式纠正后,工作正常。
答案 1 :(得分:0)
您可以尝试使用其他方法:
val df1 = firstRDD.toDF
val df2 = secondRDD.toDF
val res = df1.join(df2, Seq("loginTime"))
如果它不起作用,您可以尝试将日期转换为字符串:
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"))