Конвертировать каждое значение кадра данных - PullRequest
1 голос
/ 14 апреля 2019

Мне нужно изменить значения каждого столбца кадра данных так, чтобы все они были заключены в двойные кавычки после отображения, но кадр данных все еще сохраняет свою первоначальную структуру с заголовками.

Я попытался отобразить значения, изменив строки на последовательности, но он потерял свои заголовки в выходном фрейме данных.

С этим считывается как входной фрейм данных:

|prodid|name   |city|
+------+-------+----+
|1     |Harshit|VNS |
|2     |Mohit  |BLR |
|2     |Mohit  |RAO |
|2     |Mohit  |BTR |
|3     |Rohit  |BOM |
|4     |Shobhit|KLK |

Я попробовал следующий код.

val columns = df.columns
df.map{ row => 
           row.toSeq.map{col => "\""+col+"\"" }
    }.toDF(columns:_*)

Но выдает ошибку, утверждающую, что в отображенном кадре данных есть только 1 заголовок, т.е. значение. Это фактический результат (если я удалю «.df (columns: _ *)»):

|               value|
+--------------------+
|["1", "Harshit", ...|
|["2", "Mohit", "B...|
|["2", "Mohit", "R...|
|["2", "Mohit", "B...|
|["3", "Rohit", "B...|
|["4", "Shobhit", ...|
+--------------------+

И мой ожидаемый результат примерно такой:

|prodid|name     |city  |
+------+---------+------+
|"1"   |"Harshit"|"VNS" |
|"2"   |"Mohit"  |"BLR" |
|"2"   |"Mohit"  |"RAO" |
|"2"   |"Mohit"  |"BTR" |
|"3"   |"Rohit"  |"BOM" |
|"4"   |"Shobhit"|"KLK" |

Примечание. В этом примере всего 3 заголовка, но в моих исходных данных много заголовков, поэтому вводить каждый из них вручную невозможно, если заголовок файла изменяется. Как мне получить этот измененный массив данных значения из этого?

Редактировать: если мне нужны кавычки для всех значений, кроме целых чисел. Итак, вывод выглядит примерно так:

|prodid|name     |city  |
+------+---------+------+
|1     |"Harshit"|"VNS" |
|2     |"Mohit"  |"BLR" |
|2     |"Mohit"  |"RAO" |
|2     |"Mohit"  |"BTR" |
|3     |"Rohit"  |"BOM" |
|4     |"Shobhit"|"KLK" |

1 Ответ

5 голосов
/ 14 апреля 2019

Может быть проще использовать select вместо:

val df = Seq((1, "Harshit", "VNS"), (2, "Mohit", "BLR"))
  .toDF("prodid", "name", "city")

df.select(df.schema.fields.map {
  case StructField(name, IntegerType, _, _) => col(name)
  case StructField(name, _, _, _) => format_string("\"%s\"", col(name)) as name
}:_*).show()

Вывод:

+------+---------+-----+
|prodid|     name| city|
+------+---------+-----+
|     1|"Harshit"|"VNS"|
|     2|  "Mohit"|"BLR"|
+------+---------+-----+

Обратите внимание, что существуют и другие числовые типы, такие как LongType и DoubleType, поэтомувозможно, придется обрабатывать их или просто указать StringType и т. д.

...