2016-01-30 4 views
2

Я пытаюсь понять точную разницу и какой метод можно использовать в каком конкретном сценарии между созданием схемы неясно & Программно.Spark SQL - Точная разница между созданием схемы неявно и программно

На сайте Databricks информация не такая уж иная. & пояснительная записка.

Как мы видим, при использовании метода Reflection (implicit RDD to DF) мы можем создать класс Case, выбирая конкретные столбцы из текстового файла с помощью функции Map.

И в Программном Style - мы загружаем набор данных в текстовый файл (по аналогии с отражением)

Созданием SchemaString (String) = «Зная файл можно указать столбцы нам нужны» (Подобный случай класс в Отражение путь)

Импорт ROW API - который снова карта в определенных столбцы & типов данных, используемых в схеме String (аналогично случаю классов)

Затем мы создаем DataFrame & после этого все такое же .. И что является точной разницей в этих двух подходах.

http://spark.apache.org/docs/1.5.2/sql-programming-guide.html#inferring-the-schema-using-reflection

http://spark.apache.org/docs/1.5.2/sql-programming-guide.html#programmatically-specifying-the-schema

Пожалуйста Объясните ...

ответ

1

Получаемые схемы одинаковы, так что с этой точки зрения, нет никакой разницы. В обоих случаях вы поставляете схему для своих данных, но в одном случае вы делаете это из класса case, а в другом вы можете использовать коллекции, поскольку схема построена как StructType(Array[StructField]). Так что это в основном выбор между кортежами и коллекциями. То, как я это вижу, самое большое различие заключается в том, что классы классов должны быть в коде, тогда как программное указание схемы может быть выполнено во время выполнения, поэтому вы можете, например, построить схему на основе другого DataFrame, который вы читаете во время выполнения. В качестве примера я написал общий инструмент для «вложенности» данных, чтения из CSV и преобразования набора префиксного поля в массив структур. Поскольку инструмент является общим, а схема известна только во время выполнения, я использовал программный подход. С другой стороны, проще всего закодировать его с отражением, так как вам не нужно иметь дело со всеми объектами StructField, так как они получены из метастабильности улья, их тип данных должен быть сопоставлен с вашими типами scala.

+0

Несколько очищается, но это было бы здорово, если вы разместите пример с разницей между ними. – AJm

0

Программным Указание схемы Когда классы случае не могут быть определены заранее (например, структура записей кодируется в виде строки, или текстовый набор данных будет разобран и поля будут проектироваться по-разному для разных пользователей), DataFrame может быть создан программно с тремя шагами.

Создать RDD строк из исходного RDD; Создайте схему, представленную StructType, соответствующую структуре строк в RDD, созданной на этапе 1. Примените схему к RDD строк с помощью метода createDataFrame, предоставленного SQLContext.

Например:

Выведение Схемы с помощью отражения Интерфейс Scala для искрового SQL поддерживает автоматическое преобразования RDD, содержащий классы случае к DataFrame. Класс case определяет схему таблицы. Имена аргументов класса case считываются с использованием отражения и становятся именами столбцов. Классы классов также могут быть вложенными или содержать сложные типы, такие как последовательности или массивы. Этот RDD может быть неявно преобразован в DataFrame и затем зарегистрирован как таблица. Таблицы могут использоваться в последующих операциях SQL.

Например:

// sc is an existing SparkContext. 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
// this is used to implicitly convert an RDD to a DataFrame. 
import sqlContext.implicits._ 

// Define the schema using a case class. 
// Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit, 
// you can use custom classes that implement the Product interface. 
case class Person(name: String, age: Int) 

// Create an RDD of Person objects and register it as a table. 
val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF() 
people.registerTempTable("people") 
Смежные вопросы