【问题标题】:scala: fill non-existing case class after leftOuterJoinscala:在leftOuterJoin之后填充不存在的案例类
【发布时间】:2020-05-24 06:34:46
【问题描述】:

我有一个这种格式的案例类的配对 RDD“A”

case class MyCaseClass(ID: String, date: Date, label: String)

像这样:

"ID1", ("ID1", 2006-06-28, "label1")
"ID2", ("ID2", 1996-05-13, "label2")
...

我正在尝试用这样的 ID 数组“B”来 leftOuterJoin 这个 RDD

[("ID1", "ID1") ("ID2", "ID2") ...]

原来如此

val C = B.leftOuterJoin(A)

然后我得到一些输出条目如下所示

("ID",("ID",Some(MyCaseClass("ID",2006-06-28,"label"))))

还有一些其他的输出条目看起来像这样

(ID,(ID,None))

我知道这是因为 B 中存在一些 ID,但 A 中不存在。然后我想通过这样做来填补那些缺失的值

val D = C.map(x => (x._1, x._2._2.getOrElse(MyCaseClass("xxx",9999-01-01,"-999"))))

但 scala 抱怨此错误消息:

<console>:1: error: Decimal integer literals may not have a leading zero. (Octal syntax is obsolete.)
    val D = C.map(x => (x._1, x._2._2.getOrElse(MyCaseClass("xxx",9999-01-01,"-999"))))
                                                                       ^

我最初在这里 (scala: how to rectify "option" type after leftOuterJoin) 提出了同样问题的简单版本, 但它似乎比我想象的要复杂。 非常感谢您的帮助!

【问题讨论】:

    标签: scala rdd


    【解决方案1】:

    您正在尝试使用 Date 类型的日期字段创建案例类对象,但给他的文字包含数字。您需要创建 date 对象而不是 9999-01-01

    val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
    val D = C.map(x => (x._1, x._2._2.getOrElse(MyCaseClass("xxx",format.parse("9999-01-01"),"-999"))))
    

    【讨论】:

    • 谢谢!原来我必须使用“import java.sql.Date”
    猜你喜欢
    • 2020-05-24
    • 2010-11-06
    • 2020-08-27
    • 1970-01-01
    • 2013-02-02
    • 2011-08-25
    • 2012-02-15
    • 1970-01-01
    • 2010-11-16
    相关资源
    最近更新 更多