Я хотел бы динамически генерировать кадр данных, содержащий запись заголовка для отчета, поэтому создавая кадр данных из значения строки ниже:
val headerDescs : String = "Name,Age,Location"
val headerSchema = StructType(headerDescs.split(",").map(fieldName => StructField(fieldName, StringType, true)))
Однако теперь я хочу сделать то же самое для данных (которые фактически являются теми же данными, то есть метаданными).
Я создаю RDD:
val headerRDD = sc.parallelize(headerDescs.split(","))
Затем я намеревался использовать createDataFrame для его создания:
val headerDf = sqlContext.createDataFrame(headerRDD, headerSchema)
однако это не удается, потому что createDataframe
ожидает RDD[Row]
, однако мой RDD представляет собой массив строк - я не могу найти способ преобразовать свой RDD в RDD Row, а затем динамически отображать поля. Примеры, которые я видел, предполагают, что вы заранее знаете количество столбцов, однако я хочу, чтобы в конечном итоге можно было изменять столбцы без изменения кода - например, имея столбцы в файле.
Фрагмент кода, основанный на первом ответе:
val headerDescs : String = "Name,Age,Location"
// create the schema from a string, splitting by delimiter
val headerSchema = StructType(headerDescs.split(",").map(fieldName => StructField(fieldName, StringType, true)))
// create a row from a string, splitting by delimiter
val headerRDDRows = sc.parallelize(headerDescs.split(",")).map( a => Row(a))
val headerDf = sqlContext.createDataFrame(headerRDDRows, headerSchema)
headerDf.show()
Выполнение этого приводит к:
+--------+---+--------+
| Name|Age|Location|
+--------+---+--------+
| Name|
| Age|
|Location|
+--------+---+-------