发生这种情况是因为
NULL在SQL中等效于“未知”。这意味着与/
NULL以外的任何比较均未定义并返回。
IS NULL``IS NOTNULL``NULL
case class Record(id: Integer, value: String)val df = sc.parallelize(Seq(Record(1, "foo"), Record(2, null))).toDFdf.registerTempTable("df")sqlContext.sql("""SELECt value = "foo" FROM df""").show// +----+// | _c0|// +----+// |true|// |null|// +----+sqlContext.sql("""SELECt value != "foo" FROM df""").show// +-----+// | _c0|// +-----+// |false|// | null|// +-----+
因此,
IN/
NOT IN也未定义:
sqlContext.sql("""SELECt value IN ("foo", "bar") FROM df""").show// +----+// | _c0|// +----+// |true|// |null|// +----+
这是标准的SQL行为,正确实施SQL标准的系统应以相同的方式运行。如果要过滤并保留
NULLs,则必须明确地进行过滤:
sqlContext.sql( """SELECt value IN ("foo", "bar") OR value IS NULL FROM df""").show// +----+// | _c0|// +----+// |true|// |true|// +----+
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)