ClassCastException на dataset.show - PullRequest
0 голосов
/ 07 ноября 2019

Моя схема:

 StructField[] fields = new StructField[] {
     DataTypes.createStructField("id", DataTypes.LongType, true),
     DataTypes.createStructField("name", DataTypes.StringType, true)
}

StructType schema = new StructType(fields);

Я читаю несколько файлов CSV из-за неподдерживаемого сжатия. Я не использую .read().csv(). Во всяком случае я прочитал мой файл CSV после распаковки его. Я перебираю каждую строку и создаю новую строку из строки, разделенной разделителем:,

List<Row> rows = new ArrayList();
Row row = RowFactory.create(line.split(","));
rows.add(row);

List<Tuple2<String, List<Row>> csvRows = new ArrayList();
rows.add(new Tuple2("..", rows);

Мои строки в CSV таковы:

"1","ABCD"
"2","EFGH"

Когда я пытаюсь создатьDataset<Row> из моего списка и вызова на нем я получаю ClassCastException String cannot be cast to Long.

Dataset<Row> set = spartSession.createDataFrame(csvRows.get(0)._2, schema);  
set.show();

Но «1» должен быть преобразуемым из String в Long.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

JavaDoc для ClassCastException

В нем говорится: -

Брошенный, чтобы указать, что код попытался привести объект к подклассу, к которому он относитсяэто не экземпляр. Например, следующий код создает исключение ClassCastException:

Object x = new Integer(0);
System.out.println((String)x);

Решение: -

Используйте метод Long.parseLong(String) для преобразования строки в Long

0 голосов
/ 07 ноября 2019

Нельзя приводить от String к Long, просто попробуйте это:

Long number = (Long) "1";

Это не скомпилируется с сообщением Cannot cast from String to Long, что является полностью нормальным. Long не является подклассом String.

Если я правильно понимаю ваш код, вам сначала нужно проанализировать значение (которое является строкой) из строки, прежде чем передать его в createDataFrame.

* 1009. * Примерно так:
Long.parseLong(csvRows.get(0)._2)

Надеюсь, это поможет!

...