第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Apache Spark中的案例類相等

Apache Spark中的案例類相等

Apache Spark中的案例類相等為什么Spark中的模式匹配與Scala中的模式匹配不同?參見下面的示例...函數(shù)f()試圖在類上進(jìn)行模式匹配,該類在Scala REPL中有效,但在Spark中失敗,并導(dǎo)致所有“ ???”。 f2()是一種解決方法,可以在使用的Spark中獲得所需的結(jié)果.isInstanceOf(),但是我知道這在Scala中是不好的形式。在此情況下,Spark中的模式正確匹配方面的任何幫助將不勝感激。abstract class a extends Serializable {val a: Int}case class b(a: Int) extends a  case class bNull(a: Int=0) extends a  val x: List[a] = List(b(0), b(1), bNull())val xRdd = sc.parallelize(x)嘗試在Scala REPL中可用但在Spark中失敗的模式匹配def f(x: a) = x match {     case b(n) => "b"     case bNull(n) => "bnull"     case _ => "???"}解決方法在Spark中起作用,但格式不正確(我認(rèn)為)def f2(x: a) = {     if (x.isInstanceOf[b]) {         "b"     } else if (x.isInstanceOf[bNull]) {         "bnull"     } else {         "???"     }}查看結(jié)果xRdd.map(f).collect                   //does not work in Spark                                       // result: Array("???", "???", "???")xRdd.map(f2).collect                  // works in Spark                                       // resut: Array("b", "b", "bnull")x.map(f(_))                           // works in Scala REPL                                           // result: List("b", "b", "bnull")使用的版本... Spark結(jié)果在spark-shell中運(yùn)行(在AWS EMR-4.3上為Spark 1.6)在SBT 0.13.9中為Scala REPL(Scala 2.10.5)
查看完整描述

2 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個贊

這是Spark REPL的已知問題。您可以在SPARK-2620中找到更多詳細(xì)信息。它會影響Spark REPL中的多種操作,包括上的大多數(shù)轉(zhuǎn)換PairwiseRDDs。例如:

case class Foo(x: Int)val foos = Seq(Foo(1), Foo(1), Foo(2), Foo(2))foos.distinct.size// Int = 2val foosRdd = sc.parallelize(foos, 4)foosRdd.distinct.count// Long = 4  foosRdd.map((_, 1)).reduceByKey(_ + _).collect// Array[(Foo, Int)] = Array((Foo(1),1), (Foo(1),1), (Foo(2),1), (Foo(2),1))foosRdd.first == foos.head// Boolean = falseFoo.unapply(foosRdd.first) == Foo.unapply(foos.head)// Boolean = true

更糟糕的是結(jié)果取決于數(shù)據(jù)分布:

sc.parallelize(foos, 1).distinct.count// Long = 2sc.parallelize(foos, 1).map((_, 1)).reduceByKey(_ + _).collect// Array[(Foo, Int)] = Array((Foo(2),2), (Foo(1),2))

您可以做的最簡單的事情是在REPL之外定義和打包所需的案例類。直接使用提交的任何代碼也spark-submit應(yīng)該起作用。

在Scala 2.11+中,您可以使用直接在REPL中創(chuàng)建一個包paste -raw

scala> :paste -raw// Entering paste mode (ctrl-D to finish)package barcase class Bar(x: Int)// Exiting paste mode, now interpreting.scala> import bar.Barimport bar.Barscala> sc.parallelize(Seq(Bar(1), Bar(1), Bar(2), Bar(2))).distinct.collect
res1: Array[bar.Bar] = Array(Bar(1), Bar(2))


查看完整回答
反對 回復(fù) 2019-09-26
?
守著一只汪

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個贊

我看到提到模式匹配在那兒的spark殼中不起作用,但是沒有細(xì)節(jié)...您是說如果我在jar中定義case類,我將能夠在REPL中對它們進(jìn)行模式匹配?再次感謝

查看完整回答
反對 回復(fù) 2019-09-26
  • 2 回答
  • 0 關(guān)注
  • 538 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號