【问题标题】:Format csv file with column creation in Spark scala在 Spark scala 中使用列创建格式化 csv 文件
【发布时间】:2019-05-29 08:50:26
【问题描述】:

我有一个csv文件,如下

它有 6 行,第一行作为标题,而标题读作“学生分数” 数据框将它们视为一列,现在我想将两列与数据分开。 “student”和“marks”用空格隔开。

df.show()    
_______________
##Student Marks##    
---------------    
A   10;20;10;20    
A   20;20;30;10    
B   10;10;10;10    
B   20;20;20;10    
B   30;30;30;20

现在我想将这个 csv 表转换成两列,包括学生和分数,对于每个学生来说,分数加起来,如下所示

Student | Marks
A       | 30;40;40;30
B       | 60;60;60;40

我在下面尝试过,但它抛出了一个错误

df.withColumn("_tmp", split($"Students Marks","\\ ")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2")).drop("_tmp")

【问题讨论】:

    标签: scala apache-spark hadoop apache-spark-sql


    【解决方案1】:

    您可以读取带有您想要的分隔符的csv文件并计算结果如下

        val df = spark.read
          .option("header", true)
          .option("delimiter", " ")
          .csv("path to csv")
    

    在你得到数据框df之后

    val resultDF = df.withColumn("split", split($"Marks", ";"))
      .withColumn("a", $"split"(0))
      .withColumn("b", $"split"(1))
      .withColumn("c", $"split"(2))
      .withColumn("d", $"split"(3))
      .groupBy("Student")
      .agg(concat_ws(";", array(
         Seq(sum($"a"), sum($"b"), sum($"c"), sum($"d")): _*)
      ).as("Marks"))
    
    
    resultDF.show(false)
    

    输出:

    +-------+-------------------+
    |Student|Marks              |
    +-------+-------------------+
    |B      |60.0;60.0;60.0;40.0|
    |A      |30.0;40.0;40.0;30.0|
    +-------+-------------------+
    

    【讨论】:

      【解决方案2】:

      三个想法。第一个是读取文件,按空格分割,然后创建dataFrame:

      val df = sqlContext.read
        .format("csv")
        .option("header", "true")
        .option("delimiter", " ")
        .load("your_file.csv")
      

      第二种是将文件读入dataframe并拆分:

      df.withColumn("Student", split($"Students Marks"," ").getItem(0))
        .withColumn("Marks", split($"Students Marks"," ").getItem(1))
        .drop("Students Marks")
      

      最后一个是您的解决方案。它应该可以工作,但是当你使用 select 时,你不使用 $"_tmp",因此,它应该在没有 .drop("_tmp") 的情况下工作

      df.withColumn("_tmp", split($"Students Marks"," "))
        .select($"_tmp".getItem(0).as("Student"),$"_tmp".getItem(1).as("Marks"))
      

      【讨论】:

      • org.apache.spark.sql.AnalysisException: cannot resolve 'value' given input columns : [Student Marks];;
      • 我编辑了我的回复,你也可以用sep代替delimiter吗?
      • val df = spark.read.option("delimiter", " ").option("header", "true").csv("path/to/file") 如果这不起作用,我可以看看你的错误吗?
      • 这里不是错误,但在第二行,它抛出错误 org.apache.spark.sql.AnalysisException: cannot resolve 'value' given input columns : [Student Marks];; .
      • 我编辑了我的回复,并用“学生分数”更改了“价值”,尝试三个新选项之一
      猜你喜欢
      • 1970-01-01
      • 2015-11-30
      • 2020-06-01
      • 1970-01-01
      • 2017-10-02
      • 2021-01-08
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多