繁体   English   中英

我如何使用 java spark 转置 csv 数据

[英]How can i transpose csv data using java spark

我正在使用 java spark,我想知道是否可以转换下面给出的示例数据

Incremental Cost Number | Approver Names                          
---------------------------------------------------------------------------------
S703401                  |Ryan P Cassidy|Christopher J Mattingly|Frank E 
                         LaSota|Ryan P Cassidy|Anthony L Locricchio|Jason Monte                                                                    

变成这样。

Incremental Cost Number| Approver Names                          
-------------------------------------------
S703401                | Ryan P Cassidy
S703401                | Christopher J Mattingly
S703401                | Frank E LaSota
S703401                | Ryan P Cassidy
S703401                | Anthony L Locricchio
S703401                | Jason Monte 

此外,我正在导入的文件是一个逗号分隔的 csv 文件,只是包含多个值的特定列由管道符号分隔。 同样,如果我有多个增量成本数值。

我认为你需要用“|”分割第二列然后使用explode()函数

df.select(col("id"), explode(split(col("a"), "\\|")).as("a")).show()

+-------+--------------------+
|     id|                   a| 
+-------+--------------------+
|S703401|      Ryan P Cassidy|
|S703401|Christopher J Mat...|
|S703401|             Frank E|

注意:这是RDD的做事方式。 在 Scala 和 Dataframe 中可能更容易。

  1. 使用SparkContext读取文件
  2. 更具体地说,您需要使用textFile() API,它将为您提供 RDD。
  3. 一旦你有了RDD ,你就可以根据逗号对每条记录进行标记(这是在 RDD 上调用 map() API 并将 map 函数传递给它来完成的。在你的情况下,这个函数可以实现为将逗号分隔的字符串拆分为多个标记. 您可以使用元组数据结构来发出输出。
  4. 您可以根据您拥有的字段数选择 Tuple1 到 Tuple22。 请参阅此处
  5. 第 3 步应该再次返回一个元组的 RDD。 您在此 RDD 上运行flatMap函数,它将使用元组中的第一个字段并将其连接到其他必需的元组字段。
  6. 完成后,您可以通过使用逗号分隔符连接所有元组字段,再次将所有内容重新组合在一起。 (这将是另一个地图功能)
  7. 最后调用saveAsTextFile()来保存更新的数据。

如果您有多个列,则可以执行以下操作

  import org.apache.spark.sql.functions._

   val df = Seq(("S703401","Ryan P Cassidy|Christopher J Mattingly|Frank E 
   LaSota|Ryan P Cassidy|Anthony L Locricchio|Jason 
   Monte","xyz|mnp|abc")).toDF("Incremental Cost Number","Approver 
   Names","3rd Column")


  df.withColumn("Approver Names", explode(split(col("Approver Names"), "\\|")))
  .withColumn("3rd Column", explode(split(col("3rd Column"), "\\|")))
  .show()


   +-----------------------+--------------------+-----------+
   |Incremental Cost Number|      Approver Names| 3rd Column|
   +-----------------------+--------------------+-----------+
   |                S703401|Ryan P Cassidy|Ch...|xyz|mnp|abc|
   +-----------------------+--------------------+-----------+

   +-----------------------+--------------------+----------+
   |Incremental Cost Number|      Approver Names|3rd Column|
   +-----------------------+--------------------+----------+
   |                S703401|      Ryan P Cassidy|       xyz|
   |                S703401|      Ryan P Cassidy|       mnp|
   |                S703401|      Ryan P Cassidy|       abc|
   |                S703401|Christopher J Mat...|       xyz|
   |                S703401|Christopher J Mat...|       mnp|
   |                S703401|Christopher J Mat...|       abc|
   |                S703401|      Frank E LaSota|       xyz|
   |                S703401|      Frank E LaSota|       mnp|
   |                S703401|      Frank E LaSota|       abc|
   |                S703401|      Ryan P Cassidy|       xyz|
   |                S703401|      Ryan P Cassidy|       mnp|
   |                S703401|      Ryan P Cassidy|       abc|
   |                S703401|Anthony L Locricchio|       xyz|
   |                S703401|Anthony L Locricchio|       mnp|
   |                S703401|Anthony L Locricchio|       abc|
   |                S703401|         Jason Monte|       xyz|
   |                S703401|         Jason Monte|       mnp|
   |                S703401|         Jason Monte|       abc|
   +-----------------------+--------------------+----------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM