apache-spark - read - spark sql tutorial




Spark DataFrames: registerTempTable vs not (2)

Я только что начал с DataFrame вчера, и мне это очень нравится.

Я не понимаю ни одной вещи, хотя ... (Обращаясь к примеру в разделе «Программно задавая схему» здесь: https://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema )

В этом примере dataframe регистрируется как таблица (я угадываю, чтобы предоставить доступ к SQL-запросам ..?), Но точно такую ​​же информацию, к которой обращаются, также может быть сделано peopleDataFrame.select («name»).

Итак, вопрос в том, когда .. Если вы хотите зарегистрировать фрейм данных как таблицу, а не просто использовать данные функции dataframe? И один вариант более эффективен, чем другой?


Существует хороший сравнительный тест, сравнивающий производительность RDD и DataFrame и SparkSQL:

Spark RDDs против DataFrames против SparkSQL

Очевидно, GroupBy с подсчетом и сортировкой групп с SparkSQL заметно быстрее.

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


Причина использования метода registerTempTable( tableName ) для DataFrame заключается в том, что помимо возможности использования методов, DataFrame Spark для DataFrame , вы также можете DataFrame SQL-запросы с помощью sqlContext.sql( sqlQuery ) , который используйте DataFrame в качестве таблицы SQL. Параметр tableName указывает имя таблицы, которое будет использоваться для этого DataFrame в SQL-запросах.

val sc: SparkContext = ...
val hc = new HiveContext( sc )
val customerDataFrame = myCodeToCreateOrLoadDataFrame()
customerDataFrame.registerTempTable( "cust" )
val query = """SELECT custId, sum( purchaseAmount ) FROM cust GROUP BY custId"""
val salesPerCustomer: DataFrame = hc.sql( query )
salesPerCustomer.show()

Использование методов SQL или DataFrame, таких как select и groupBy , вероятно, в значительной степени groupBy от предпочтений. Я понимаю, что SQL-запросы переводится в планы выполнения Spark.

В моем случае я обнаружил, что на языке запросов Hive SQL были доступны некоторые типы запросов агрегирования и окон, которые мне нужны, например вычисление текущего баланса для каждого клиента, что, как я подозреваю, было бы очень сложно сделать в Spark.

Если вы хотите использовать SQL, то, скорее всего, вам захочется создать HiveContext вместо обычного SQLContext . Язык запросов Hive поддерживает более широкий диапазон SQL, чем доступный через простой SQLContext .





dataframe