输入数据包含以下行:
2017043008,21655065096,2017-04-30 08:03:54,56.0,0,2,2017-04-30 08:04:50,21625368946
2017043021,21621452483,2017-04-30 21:43:41,105.0,0,2,2017-04-30 21:45:26,21625672898
2017043018,21629237860,2017-04-30 18:01:28,337.0,0,2,2017-04-30 18:07:05,21628741975
代码是:
val schema = new StructType().add(StructField("call_id", StringType, true)).
add(StructField("o_msisdn", StringType, true)).
add(StructField("call_start_time", StringType, true)).
add(StructField("duration", FloatType, true)).
add(StructField("o_call_id", StringType, true)).
add(StructField("call_type", StringType, true)).
add(StructField("call_end_time",StringType, true)).
add(StructField("s_msisdn", StringType, true))
val callRows = callData.map(line => line.split(",").map(_.trim))
val rdd = callRows.map(row =>
Row(row(0),row(1),row(2),row(3),row(4),row(5),row(6),row(7)))
val callsDataDF= sqlContext.createDataFrame(rdd, schema)
使用以下内容对上述数据框进行分组:
val groupedCalls = callsDataDF.groupBy($"s_msisdn", $"o_msisdn")
.agg(count($"call_id").as("count"))
.filter("count >3")
val callsDF = callsDataDF.toDF
val groupedDF = groupedCalls.toDF
加入两个数据帧,以获取具有dataFrame1.col5 == dataFrame2.col6
val res1 = callsDataDF.join(groupedDF,
callsDataDF("s_msisdn") === groupedDF("o_msisdn"))
问题是这给出了0行的输出,这是不正确的。
以下代码给出了正确的结果
callsDataDF.registerTempTable("calls")
groupedCalls.registerTempTable("grouped")
sqlContext.sql("""select calls.*, grouped.o_msisdn, grouped.count
from calls join grouped on calls.s_msisdn=grouped.o_msisdn""").show()
我的问题是为什么sql变量给出了正确的结果,而不是scala join。