【问题标题】:Split field and create multi rows from one row Spark-Scala拆分字段并从一行创建多行 Spark-Scala
【发布时间】:2017-10-25 06:46:57
【问题描述】:

我是新手,我需要帮助解决这个问题。

我有一个这样的 csv 文件:

ANI,2974483123 29744423747 293744450542,Twitter,@ani

我需要拆分第二列“2974483123 29744423747 293744450542”并创建 3 行,如下所示:

ANI,2974483123,Twitter,@ani

ANI,29744423747,Twitter,@ani

ANI,293744450542,Twitter,@ani

有人可以帮助我吗?请!

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    flatMap 就是你要找的东西:

    val input: RDD[String] = sc.parallelize(Seq("ANI,2974483123 29744423747 293744450542,Twitter,@ani"))
    val csv: RDD[Array[String]] = input.map(_.split(','))
    
    val result = csv.flatMap { case Array(s1, s2, s3, s4) => s2.split(" ").map(part => (s1, part, s3, s4)) }
    

    【讨论】:

    • 只关注三个国家:US,CA,MX .....原始记录:["MotelID", "BidDate", "HU", "UK", "NL", "US "、"MX"、"AU"、"CA"、"CN"、"KR"、"BE"、"I"、"JP"、"IN"、"HN"、"GY"、"DE"] [0000002,11-05-08-2016,0.92,1.68,0.81,0.68,1.59,,1.63,1.77,2.06,0.66,1.53,,0.32,0.88,0.83,1.01] 只保留三个重要的 0000002,11 -05-08-2016,1.59,,1.77 转置记录并将相关的 Losa 包含在单独的列中 0000002,11-05-08-2016,US,1.59 0000002,11-05-08-2016,MX, 0000002, 11-05-08-2016,CA,1.77 ....如何获得上述结果?
    【解决方案2】:

    这里有一个稍微不同的解决方案,它利用了 Spark 可用的内置 SQL UDF。理想情况下,应该使用这些而不是自定义函数来利用查询优化器 (https://blog.cloudera.com/blog/2017/02/working-with-udfs-in-apache-spark/) 提供的性能改进。

    import org.apache.spark.sql.functions.{split, explode}
    
    val filename = "/path/to/file.csv"
    val columns = Seq("col1","col2","col3","col4")
    
    val df = spark.read.csv(filename).toDF(columns: _*)
    
    // import "split" instead of writing your own split UDF
    df.withColumn("col2", split($"col2", " ")).
      // import "explode instead of map then flatMap
      select($"col1", explode($"col2"), $"col3", $"col4").take(10)
    

    【讨论】:

      【解决方案3】:

      与 Tzach 的答案非常相似,但在 python2 中并注意多空间分隔符。

      import re
      
      rdd = sc.textFile("datasets/test.csv").map(lambda x: x.split(","))
      
      print(rdd.take(1))
      print(rdd.map(lambda (a, b, c, d): [(a, number, c, d) for number in re.split(" +", b)])
               .flatMap(lambda x: x)
               .take(10))
      
      #[[u'ANI', u'2974481249 2974444747 2974440542', u'Twitter', u'maximotussie']]
      #[(u'ANI', u'2974481249', u'Twitter', u'maximotussie'), 
      # (u'ANI', u'2974444747', u'Twitter', u'maximotussie'), 
      # (u'ANI', u'2974440542', u'Twitter', u'maximotussie')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        • 2020-05-28
        • 2023-04-02
        • 2020-04-11
        相关资源
        最近更新 更多