Генерация Dataframe с различным количеством столбцов - PullRequest
0 голосов
/ 13 мая 2018

Представьте себе CSV следующим образом:

a,b,c,d
1,1,0,0
0,1,1,0
...

Я хочу автоматически получить DF с 4 столбцами a, b, c, d.

Ручная техника может быть:

val rdd = sc.textFile(path).map(_.split(","))
val cols = (0 until rdd.first.size).map(_.toString).toArray
val df = rdd.map{ case Array(a, b, c, d) => (a, b, c, d) }.toDF(cols:_*)

Проблема с этой техникой заключается в том, что мне нужно точно указать количество столбцов a, b, c, d, что может быть проблематично с сотнями или более функциями.

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

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Spark может автоматически определить схему для вас при чтении файла данных.Если у вас есть файл CSV с заголовками, вы можете использовать

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

. В вашем примере это приведет к (используя df.show()):

+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  1|  0|  0|
|  0|  1|  1|  0|
+---+---+---+---+
0 голосов
/ 13 мая 2018

Вы можете использовать Row и схему:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

val header = rdd.first

spark.createDataFrame(
  rdd.map(row => Row.fromSeq(row.take(header.size))), 
  StructType(header map (StructField(_, StringType)))
)

, но здесь, просто используйте Spark CSV reader .

но я нехочу уточнить любую схему.

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

Связанный:

...