我来自关系数据库世界,所以我有点困惑,Spark SQL 似乎没有利用任何模式约束,如主键、外键和非空约束。
我相信这就是为什么我总是观察到notnull查询计划中存在一些冗余检查。
所以我的问题是,如果数据源定义了这些约束,是否有任何可能的方法让 Spark SQL 利用这些约束?
谢谢。
如果std::false_type是类型,此类型的有效值是多少?如果我只想实现类似下面的返回类型的函数std::false_type,我怎么能实现这个呢?
typename std::false_type operator()(){
return declval<std::false_type>();
}
Run Code Online (Sandbox Code Playgroud) 我得到了一个非常简单的查询,当在同一硬件上运行Spark SQL和Presto时(3小时vs 3分钟),显示出显着的性能差异。
SELECT field
FROM test1
WHERE field NOT IN (SELECT field FROM test2)
Run Code Online (Sandbox Code Playgroud)
经过对查询计划的研究,我发现原因是Spark SQL如何处理NOT IN谓词子查询。为了正确处理NOT IN的NULL,Spark SQL将NOT IN谓词转换为Left AntiJoin( (test1=test2) OR isNULL(test1=test2))。
Spark SQL引入OR isNULL(test1=test2)了确保的正确语义NOT IN。
但是,ORLeft AntiJoin连接谓词的唯一可行的物理连接策略Left AntiJoin是BroadcastNestedLoopJoin。在当前阶段,我可以将NOT IN改写为NOT EXISTS来解决此问题。在NOT EXISTS的查询计划中,我可以看到join谓词是Left AntiJoin(test1=test2)为NOT EXISTS(5分钟完成)导致更好的物理联接运算符的原因。
到目前为止,我很幸运,因为我的数据集当前没有任何NULL属性,但是将来可能会具有,而NOT IN的语义正是我真正想要的。
所以我检查了Presto的查询计划,它没有真正提供,Left AntiJoin但SemiJoin与一起使用FilterPredicate = not (expr)。Presto的查询计划没有提供太多信息,例如Spark。
所以我的问题更像是:
我可以假设Presto有更好的物理联接运算符来处理NOT IN操作吗?与Spark SQL不同,它不依赖于连接谓词的重写isnull(op1 = op2)来确保逻辑计划级别中NOT …
我访问 AWS S3 的所有工作都在该区域:us-east2AZ 是us-east-2a。
但我看到了一些来自 S3 的限制投诉,所以我想知道如果我将一些工作转移到另一个可用区,例如us-east-2b,它可以缓解问题吗?(或者它不会有帮助,因为us-east-2a和us-east-2b实际上指向相同的端点?)
谢谢。
我是scala的新手,谁能为下面的方括号[this]指出什么样的术语?
private[this] lazy val outputAttributes = AttributeSeq(output)
谢谢。
case class Thing[T](value: T)
def processThing(thing: Thing[_]) = {
thing match {
case Thing(value: Int) => "Thing of int"
case Thing(value: String) => "Thing of string"
case _ => "Thing of something else"
}
}
println(processThing(Thing(1)))
println(processThing(Thing("hello")))
Run Code Online (Sandbox Code Playgroud)
以上输出Thing of int和Thing of string. 我的问题是,如果类型橡皮擦启动,为什么类型信息在运行时仍然可用?
scala ×2
amazon-s3 ×1
apache-spark ×1
c++ ×1
erasure ×1
generics ×1
isnull ×1
null ×1
presto ×1
templates ×1
terminology ×1
type-erasure ×1