У меня есть набор данных потокового 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]|
+-----------------+

Однако я пытаюсь разбить его на три колонки. Пожалуйста помоги.

1
Ayon 6 Янв 2017 в 07:58
Пожалуйста, предоставьте схему с toDF. Что-то вроде этого val wordsDataFrame = rdd.map (_. Split (",")). ToDF ("col1", "col2", "col3"). Show () Тогда должно работать.
 – 
Rajat Mishra
6 Янв 2017 в 08:36

2 ответа

Вы можете попробовать что-то подобное.

val wordsDataFrame = rdd.map { record => {
              val recordArr = record.split(",")
              (recordArr(0),recordArr(1),recordArr(2))
            } }.toDF("col1","col2","col3")
3
Shankar 6 Янв 2017 в 08:35

Пожалуйста, предоставьте схему с toDF. Что-то вроде этого val wordsDataFrame = rdd.map(_.split(",")).toDF("col1","col2","col3").show() должно работать тогда

0
Rajat Mishra 6 Янв 2017 в 08:46