【问题标题】:Extract columns from unordered data in scala spark从scala spark中的无序数据中提取列
【发布时间】:2018-06-25 21:08:52
【问题描述】:

我正在学习 scala-spark,想知道如何根据列名从无序数据中提取所需的列?详情如下-

输入数据:RDD[Array[String]]

id=1,country=USA,age=20,name=abc
name=def,country=USA,id=2,age=30
name=ghi,id=3,age=40,country=USA

所需输出:

Name,id
abc,1
def,2
ghi,3

任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    如果你有RDD[Array[String]],那么你可以得到想要的数据

    您可以将案例类定义为

    case class Data(Name: String, Id: Long)
    

    然后将每一行解析为case class

    val df = rdd.map( row => {
      //split the line and convert to map so you can extract the data
      val data = row.split(",").map(x => (x.split("=")(0),x.split("=")(1))).toMap
      Data(data("name"), data("id").toLong)
    })
    

    转换为Dataframe并显示

    df.toDF().show(false)
    

    输出:

    +----+---+
    |Name|Id |
    +----+---+
    |abc |1  |
    |def |2  |
    |ghi |3  |
    +----+---+
    

    这是读取文件的完整代码

    case class Data(Name: String, Id: Long)
    
    def main(args: Array[String]): Unit = {
      val spark = SparkSession.builder().appName("xyz").master("local[*]").getOrCreate()
    
      import spark.implicits._
      val rdd = spark.sparkContext.textFile("path to file ")
    
      val df = rdd.map(row => {
        val data = row.split(",").map(x => (x.split("=")(0), x.split("=")(1))).toMap
        Data(data("name"), data("id").toLong)
      })
    
      df.toDF().show(false)
    }
    

    【讨论】:

    • 谢谢尚卡尔!我试过了,即使在我将案例类移出调用方法之后也会出现以下错误 - 没有可用于数据的 TypeTag。请帮忙。谢谢!
    猜你喜欢
    • 2017-05-04
    • 2021-12-09
    • 2017-03-03
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2022-11-11
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多