Извлечение значений столбцов фрейма данных в виде списка в Apache Spark



Я хотел бы преобразовать строковый столбец фрейма данных в список. Что я могу найти от Dataframe API-это RDD, поэтому я попытался сначала преобразовать его обратно в RDD, а затем применить toArray функция для RDD. В этом случае длина и SQL работают просто отлично. Однако результат, который я получил от RDD, имеет квадратные скобки вокруг каждого элемента, подобного этому [A00001]. Мне было интересно, если есть способ преобразовать столбец в список или способ снять квадратные скобки.



любой предложения будут оценены. Спасибо!

1481   5  

5 ответов:

Это должно вернуть коллекцию, содержащую один список:

dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()

без сопоставления вы просто получаете объект строки, который содержит каждый столбец из базы данных.

имейте в виду, что это, вероятно, даст вам список любого типа. Если вы хотите указать тип результата, вы можете использовать .asInstanceOf[YOUR_TYPE] in r => r(0).asInstanceOf[YOUR_TYPE] картография

P. S. Из-за автоматического преобразования можно пропустить .rdd часть.

С Искрой 2.x и Scala 2.11

я бы подумал о 3 возможных способах преобразования значений определенного столбца в List

общие фрагменты кода для всех подходов

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder.getOrCreate    
import spark.implicits._ // for .toDf() method

val df = Seq(
    ("first", 2.0),
    ("test", 1.5),
    ("choose", 8.0)
  ).toDF("id", "val")

подход 1

df.select("id").collect().map(_(0)).toList
// res9: List[Any] = List(one, two, three)

что происходит сейчас? Мы собираем данные для драйвера с collect() и выбор нулевого элемента из каждой записи.

это не может быть отличным способом сделать это, давайте улучшим его со следующим подход.


подход 2

df.select("id").rdd.map(r => r(0)).collect.toList 
//res10: List[Any] = List(one, two, three)

как это лучше? Мы распределили нагрузку преобразования карт между рабочими, а не одним драйвером.

я знаю rdd.map(r => r(0)) не кажется вам элегантным. Итак, давайте рассмотрим его в следующем подходе.


подход 3

df.select("id").map(r => r.getString(0)).collect.toList 
//res11: List[String] = List(one, two, three)

здесь мы не преобразуем фрейм данных в RDD. Посмотри на map он не примет r => r(0)(или _(0)) как предыдущий подход из-за проблем с кодировщиком в фрейме данных. Так что в конечном итоге с помощью r => r.getString(0) и это будет рассмотрено в следующих версиях Spark.

вывод

все варианты дают тот же результат, но 2 и 3 эффективны, наконец, 3-й является эффективным и элегантным(я думаю).

Databricks notebook link, который будет доступен до 6 месяцев с 2017/05/20

Я знаю, что ответ, данный и запрошенный, предполагается для Scala, поэтому я просто предоставляю небольшой фрагмент кода Python, если пользователю PySpark любопытно. Синтаксис похож на данный ответ, но чтобы правильно вывести список, мне действительно нужно второй раз ссылаться на имя столбца в функции отображения, и мне не нужен оператор select.

т. е. фрейм данных, содержащий столбец с именем "Raw"

чтобы получить каждое значение строки в " Raw " объединены в виде списка, где каждая запись-это значение строки из "Raw", которое я просто использую:

MyDataFrame.rdd.map(lambda x: x.Raw).collect()

в Scala и Spark 2+, попробуйте это (предполагая, что имя столбца "s"): df.select('s).as[String].collect

     sqlContext.sql(" select filename from tempTable").rdd.map(r => r(0)).collect.toList.foreach(out_streamfn.println) //remove brackets

он отлично работает

Comments

    Ничего не найдено.