У меня есть набор данных потокового CSV в этом формате
2,C4653,C5030
2,C5782,C16712
6,C1191,C419
15,C3380,C22841
18,C2436,C5030
Я пытаюсь взять поток Dstream и преобразовать его в DataFrame, где я должен получить каждое поле в виде столбца. что-то вроде этого.
col1 col2 col3
2 C4653 C5030
2 C5782 C16712
И так далее.
Я использую следующий код, но не могу заставить его работать. Это код, который я использую.
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc, kafkaParams, topicsSet)
val lines = messages.map(_._2)
val seperator = lines.map(_.split(","))
lines.foreachRDD { rdd =>
// Get the singleton instance of SparkSession
val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate()
import spark.implicits._
// Convert RDD[String] to DataFrame
val wordsDataFrame = rdd.map(_.split(",")).toDF().show();
}
В качестве вывода для используемого мной кода я получаю следующее.
+-----------------+
| value|
+-----------------+
|[2, C4653, C5030]|
+-----------------+
Однако я пытаюсь разбить его на три колонки. Пожалуйста помоги.
2 ответа
Вы можете попробовать что-то подобное.
val wordsDataFrame = rdd.map { record => {
val recordArr = record.split(",")
(recordArr(0),recordArr(1),recordArr(2))
} }.toDF("col1","col2","col3")
Пожалуйста, предоставьте схему с toDF. Что-то вроде этого val wordsDataFrame = rdd.map(_.split(",")).toDF("col1","col2","col3").show()
должно работать тогда
Похожие вопросы
Новые вопросы
scala
Scala - это язык программирования общего назначения, в основном предназначенный для виртуальной машины Java. Разработанный для краткого, элегантного и безопасного для типов представления общих шаблонов программирования, он сочетает в себе как императивный, так и функциональный стили программирования. Его ключевые особенности: продвинутая система статического типа с выводом типа; типы функций; сопоставления с образцом ; неявные параметры и преобразования; перегрузка оператора; полная совместимость с Java; совпадение