Как я могу транспонировать данные CSV, используя java искра - PullRequest
0 голосов
/ 18 февраля 2020

Я использую 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-файл, разделенный запятыми, просто определенный столбец, содержащий несколько значений, разделяется символом конвейера. И точно так же, если у меня есть несколько значений числа дополнительных затрат.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Примечание: это RDD способ ведения дел. Это может быть проще в Scala и Dataframe.

  1. Используйте SparkContext для чтения файла
  2. Более конкретно вам нужно использовать textFile () API, который выдаст вам RDD.
  3. Получив RDD , вы можете токенизировать каждую запись на основе запятой (это делается с помощью API map () для RDD и передачи функция map к нему. В вашем случае эта функция может быть реализована в виде разделения строки с запятой на несколько токенов. Вы можете использовать структуру данных Tuple для выдачи выходных данных.
  4. Вы можете выбрать Tuple1 to Tuple22 в зависимости от количества поля, которые у вас есть. См. здесь .
  5. Шаг 3 должен снова вернуть вам СДР из кортежей. На этом СДР вы запускаете функцию flatMap , которая будет использовать первое поле в кортеже и соедините его с другими необходимыми полями кортежа.
  6. После этого вы можете снова собрать все воедино, объединив все поля кортежа с разделителем запятыми. (Это будет другая карта функция)
  7. В конце вы вызываете saveAsTextFile () , чтобы сохранить обновленные данные.
0 голосов
/ 19 февраля 2020

Вы можете сделать что-то вроде ниже, если у вас есть несколько столбцов

  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|
   +-----------------------+--------------------+----------+
0 голосов
/ 18 февраля 2020

Я думаю, вам нужно разделить второй столбец на "|" а затем использовать функцию взрыва ()

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

+-------+--------------------+
|     id|                   a| 
+-------+--------------------+
|S703401|      Ryan P Cassidy|
|S703401|Christopher J Mat...|
|S703401|             Frank E|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...