Вопрос:

CSV в массив объектов

arrays scala csv object apache-spark

722 просмотра

2 ответа

6 Репутация автора

Я использую сторонний пакет для spark, который использует объект PointFeature. Я пытаюсь взять CSV-файл и поместить элементы из каждой строки в массив этих объектов PointFeature.

Конструктор PointFeature для моей реализации выглядит следующим образом:

Feature(Point( _c1, _c2), _c3)

где _c1, _c2 и _c3 являются столбцами моего CSV и представляют двойные.

Вот моя текущая попытка:

val points: Array[PointFeature[Double]] = for{
    line <- sc.textFile("file.csv")
    point <- Feature(Point(line._c1,line._c2),line._c3)
} yield point

Моя ошибка появляется при ссылке на столбцы

<console>:36: error: value _c1 is not a member of String
   point <- Feature(Point(line._c1,line._c2),line._c3.toDouble)
                               ^
<console>:36: error: value _c2 is not a member of String
       point <- Feature(Point(line._c1,line._c2),line._c3.toDouble)
                                            ^
<console>:36: error: value _c3 is not a member of String
       point <- Feature(Point(line._c1,line._c2),line._c3.toDouble)
                                                      ^

Это очевидно, потому что я ссылаюсь на строку, как если бы это был элемент DataFrame. Мне интересно, есть ли способ работать с DataFrames в этом формате цикла, или способ разбить каждую строку в список двойников. Может мне нужен RDD?

Кроме того, я не уверен, что это приведет к массиву. На самом деле, я подозреваю, что он вернет RDD ...

Я использую Spark 2.1.0 на Amazon EMR

Вот некоторые другие вопросы, из которых я извлек:

Как прочитать CSV-файл в массив массивов в Scala

Расщепление строк в Apache Spark с использованием Scala

Как перебрать записи искры скала?

Автор: user306603 Источник Размещён: 25.04.2017 10:20

Ответы (2)


0 плюса

25952 Репутация автора

Вы можете настроить Dataset[Feature]это так:

case class Feature(x: Double, y: Double, z: Double)
sparkSession.read.csv("file.csv")
    .toDF("x", "y", "z")
    .withColumn("x", 'x.cast(DoubleType))
    .withColumn("y", 'y.cast(DoubleType))
    .withColumn("z", 'z.cast(DoubleType))
    .as[Feature]

Тогда вы можете потреблять свой строго типизированный DataSet[Feature]по своему усмотрению.

Автор: Vidya Размещён: 25.04.2017 10:47

0 плюса

152 Репутация автора

Я предлагаю взять это в меньших шагах.

Шаг первый

Получите ваши строки как массив / список / что угодно из строк.

val lines = sc.textFile("file.txt").getLines, или что-то типа того.

Шаг второй

Разбейте свои строки на их собственные списки столбцов.

val splits = lines.map {l => l.split(",")}

Шаг третий

Извлеките ваши столбики как vals, которые вы можете использовать

val res = splits.map { 
  case Array(col1, col2, col3) => // Convert to doubles, put in to Feature/Point Structure}
  case _ => // Handle the case where your csv is malformatted
}

Все это можно сделать за один раз, я разделил их, чтобы показать логический шаг из файла → строка списка → строка списка → список

Автор: Charles Размещён: 25.04.2017 11:10
Вопросы из категории :
32x32