Определение размера таблицы (в МБ / ГБ) в Spark SQL

Во-первых, позвольте мне начать с того, что я новичок в Spark-SQL.

Я пытаюсь понять различные типы и стратегии соединения в Spark-Sql, я хочу знать о подходе к приближению размеров таблиц (которые участвуют в объединении, агрегации и т. Д.), Чтобы оценить / настроить ожидаемое время выполнения, понимая, что на самом деле происходит под капотом, чтобы помочь мне выбрать стратегию соединения, которая лучше всего подходит для этого сценария (в Spark-SQL с помощью подсказок и т. д.).

Конечно, количество строк в таблице является хорошей отправной точкой, но я хочу иметь возможность оценить размеры с точки зрения _2 _ / _ 3 _ / _ 4 _ / _ 5 _ / _ 6_, чтобы знать, какая таблица не поместится в памяти и т. Д. ), что, в свою очередь, позволило бы мне писать более эффективные SQL-запросы, выбирая тип / стратегию соединения и т. д., который лучше всего подходит для этого сценария.

Примечание: у меня нет доступа к PySpark. Мы запрашиваем таблицы Glue через Sql Workbench, подключенные к каталогу Glue с помощью драйвера Hive jdbc.

Любая помощь приветствуется.

Спасибо.


person Matthew    schedule 10.06.2020    source источник


Ответы (1)


посмотрим, поможет ли это найти размер таблицы -

 /**
      * file content
      * spark-test-data.json
      * --------------------
      * {"id":1,"name":"abc1"}
      * {"id":2,"name":"abc2"}
      * {"id":3,"name":"abc3"}
      */
    val fileName = "spark-test-data.json"
    val path = getClass.getResource("/" + fileName).getPath

    spark.catalog.createTable("df", path, "json")
      .show(false)

    /**
      * +---+----+
      * |id |name|
      * +---+----+
      * |1  |abc1|
      * |2  |abc2|
      * |3  |abc3|
      * +---+----+
      */
    // Collect only statistics that do not require scanning the whole table (that is, size in bytes).
    spark.sql("ANALYZE TABLE df COMPUTE STATISTICS NOSCAN")
    spark.sql("DESCRIBE EXTENDED df ").filter(col("col_name") === "Statistics").show(false)

    /**
      * +----------+---------+-------+
      * |col_name  |data_type|comment|
      * +----------+---------+-------+
      * |Statistics|68 bytes |       |
      * +----------+---------+-------+
      */
    spark.sql("ANALYZE TABLE df COMPUTE STATISTICS")
    spark.sql("DESCRIBE EXTENDED df ").filter(col("col_name") === "Statistics").show(false)

    /**
      * +----------+----------------+-------+
      * |col_name  |data_type       |comment|
      * +----------+----------------+-------+
      * |Statistics|68 bytes, 3 rows|       |
      * +----------+----------------+-------+
      */
person Som    schedule 10.06.2020
comment
Спасибо за ваш ответ. У меня нет доступа к PySpark. Мы выполняем только запросы SparkSQL в Sql Workbench. В рабочей среде мы получаем доступ к таблицам через каталог Glue, подключенный драйвером Hive. - person Matthew; 10.06.2020
comment
Все эти запросы являются только искровыми SQL-запросами. - person Som; 10.06.2020
comment
Однако, когда я выполнил ваши операторы в sql-workbench, он вернул ошибку: org.apache.spark.sql.AnalysisException: java.lang.IllegalArgumentException: Can not create a Path from an empty string; и для оператора описания: No object named extended mytesttable found! - person Matthew; 10.06.2020
comment
Могут ли там ваши искры sql-запросы? Я думаю нет - person Som; 10.06.2020
comment
Да ... мы запускаем искровые sql-запросы к этим таблицам каталога Glue через Sql Workbench, который использует коннектор hive jdbc. - person Matthew; 10.06.2020
comment
Запустите analyze table <table-name> compute statistics, дайте мне знать результат - person Som; 10.06.2020
comment
Для оператора ANALYZE была ошибка: org.apache.spark.sql.AnalysisException: java.lang.IllegalArgumentException: Can not create a Path from an empty string. И для оператора DESCRIBE EXTENDED также ошибки: No object named extended mytesttable found! - person Matthew; 10.06.2020
comment
Взгляните на этот искровый документ sql - docs.databricks.com/spark/latest/spark-sql/language-manual/ - person Som; 10.06.2020