Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Typesafe与Spark数据集的连接不如我预期的安全_Scala_Apache Spark - Fatal编程技术网

Scala Typesafe与Spark数据集的连接不如我预期的安全

Scala Typesafe与Spark数据集的连接不如我预期的安全,scala,apache-spark,Scala,Apache Spark,在试图将其作为一种隐含的方式提供时,我遇到了一些我不理解的东西 在下面的测试中,innerJoin的签名是def innerJoin[U,K]ds2:Dataset[U]f:T=>K,g:U=>Kimplicit e1:Encoder[K,T],e2:Encoder[K,U],e3:Encoder[T,U],但我用f:Foo=>String和g:Bar=>Int调用它。我希望在编译时出现错误,但它编译得很好。为什么呢 实际上,它编译得很好,测试失败,java.lang.ClassNotFound

在试图将其作为一种隐含的方式提供时,我遇到了一些我不理解的东西

在下面的测试中,innerJoin的签名是def innerJoin[U,K]ds2:Dataset[U]f:T=>K,g:U=>Kimplicit e1:Encoder[K,T],e2:Encoder[K,U],e3:Encoder[T,U],但我用f:Foo=>String和g:Bar=>Int调用它。我希望在编译时出现错误,但它编译得很好。为什么呢

实际上,它编译得很好,测试失败,java.lang.ClassNotFoundException:scala。我假设Any显示为Int和String的公共父级

正确的是,Any被推断为String和Int的公共父级,因此用作K。函数在输出类型中是协变的。所以Foo=>String是Foo=>Any的有效子类

解决这类问题的常用方法是使用两个类型参数和一个隐式=:=。例如:

def innerJoin[U, K1, K2](ds2: Dataset[U])(f: T => K1, g: U => K2)
  (implicit eq: K1 =:= K2, e1: Encoder[(K2, T)], e2: Encoder[(K2, U)], e3: Encoder[(T, U)]): Dataset[(T, U)] = 
  {
    val ds1_ = ds1.map(x => (eq(f(x)), x))
    ... rest the same as before ...

事实上,K被推断为任意。这听起来像是一个依赖性问题。你能包括构建定义吗?啊哈!我一直在看=:=,但没有考虑添加另一个类型参数。
def innerJoin[U, K1, K2](ds2: Dataset[U])(f: T => K1, g: U => K2)
  (implicit eq: K1 =:= K2, e1: Encoder[(K2, T)], e2: Encoder[(K2, U)], e3: Encoder[(T, U)]): Dataset[(T, U)] = 
  {
    val ds1_ = ds1.map(x => (eq(f(x)), x))
    ... rest the same as before ...