簡體   English   中英

使用占位符語法的Spark Scala過濾器

[英]spark scala filter using placeholder syntax

我有以下源文件

id,name,year,rating,duration

 1. The Nightmare Before Christmas,1993,3.9,4568
 2. The Mummy,1932,3.5,4388
 3. Orphans of the Storm,1921,3.2,9062
 4. The Object of Beauty,1991,2.8,6150
 5. Night Tide,1963,2.8,5126
 6. One Magic Christmas,1985,3.8,5333

我正在嘗試filter year=2012和以下作品的所有行。

c.map(_.split(",")).filter(x=>x(2).toInt==2012)

但是如何使用placeholder語法( _ )達到相同的效果?

我可以在map功能中使用placeholder語法( _ )(例如rdd.map((_.split(",")) )

請指教。

這是你想要的

c.map(_.split(",")).filter(_(2).toInt==2012)

但我建議您使用Spark-CSV讀取csv文件,例如

val df1 = spark.read.option("inferSchema", true)
              .option("header",true)
              .option("delimiter", ",")
              .csv("data1.csv")

然后您可以輕松地過濾為

df1.filter($"year" === "2012")

希望這可以幫助

您只需執行以下操作即可使用占位符

c.map(_.split(",")).filter(_(2).toInt==2012).map(_.toSeq).foreach(println)

但是如果您知道數據長度固定,我建議您使用案例類

case class row(id: String,
             name: String,
             year: String,
             rating: String,
             duration: String)

您可以將其用作

    c.map(_.split(",", -1)).map(array => row(array(0),array(1),array(2),array(3),array(4))).filter(x => x.year.toInt == 2012).foreach(println)

為了安全起見,您可以將Option組合為

c.map(_.split(",", -1)).map(array => {
  row(Option(array(0)) getOrElse "",
    Option(array(1)) getOrElse "",
    Option(array(2)) getOrElse "",
    Option(array(3)) getOrElse "",
    Option(array(4)) getOrElse "")
  })
  .filter(x => x.year.toInt == 2012)
  .foreach(println)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM