Как Spark вычисляет среднее и стандартное значение для строкового столбца - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть следующие данные (просто показывает фрагмент)

DEST_COUNTRY_NAME   ORIGIN_COUNTRY_NAME count
United States   Romania 15
United States   Croatia 1
United States   Ireland 344
Egypt   United States   15

Я читаю это с параметром inferSchema, установленным на true, а затем describe столбцы.Кажется, он работает нормально.

scala> val data = spark.read.option("header", "true").option("inferSchema","true").csv("./data/flight-data/csv/2015-summary.csv")
scala> data.describe().show()
+-------+-----------------+-------------------+------------------+
|summary|DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|             count|
+-------+-----------------+-------------------+------------------+
|  count|              256|                256|               256|
|   mean|             null|               null|       1770.765625|
| stddev|             null|               null|23126.516918551915|
|    min|          Algeria|             Angola|                 1|
|    max|           Zambia|            Vietnam|            370002|
+-------+-----------------+-------------------+------------------+

Если я не укажу inferSchema, то все столбцы будут считаться строковыми.

scala> val dataNoSchema = spark.read.option("header", "true").csv("./data/flight-data/csv/2015-summary.csv")
dataNoSchema: org.apache.spark.sql.DataFrame = [DEST_COUNTRY_NAME: string, ORIGIN_COUNTRY_NAME: string ... 1 more field]

scala> dataNoSchema.printSchema
root
 |-- DEST_COUNTRY_NAME: string (nullable = true)
 |-- ORIGIN_COUNTRY_NAME: string (nullable = true)
 |-- count: string (nullable = true)

Вопрос 1) Почему тогда Spark дает значения mean и stddev для последнего столбца count

scala> dataNoSchema.describe().show();
+-------+-----------------+-------------------+------------------+
|summary|DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|             count|
+-------+-----------------+-------------------+------------------+
|  count|              256|                256|               256|
|   mean|             null|               null|       1770.765625|
| stddev|             null|               null|23126.516918551915|
|    min|          Algeria|             Angola|                 1|
|    max|           Zambia|            Vietnam|               986|
+-------+-----------------+-------------------+------------------+

Вопрос 2) Если Spark теперь интерпретирует count как столбец numeric, то почему maxзначение равно 986, а не 37002 (как в данных DataFrame)

1 Ответ

0 голосов
/ 03 февраля 2019

Spark SQL стремится быть совместимым со стандартом SQL, поэтому использует те же правила оценки и, при необходимости, прозрачно приводит типы к выполнению выражения (см., Например, мой ответ к PySpark DataFrames - фильтрацияиспользование сравнений между столбцами разных типов ).

Это означает, что случаи max и mean / stddev просто не эквивалентны:

  • максимум имеет значение для строк (с лексикографическим порядком ), и никакого принуждения не требуется

    Seq.empty[String].toDF("count").agg(max("count")).explain
    
    == Physical Plan ==
    SortAggregate(key=[], functions=[max(count#69)])
    +- Exchange SinglePartition
       +- SortAggregate(key=[], functions=[partial_max(count#69)])
          +- LocalTableScan <empty>, [count#69]
    
  • среднего или стандартного отклонения нет, и аргументприведено к удвоению

    Seq.empty[String].toDF("count").agg(mean("count")).explain
    
    == Physical Plan ==
    *(2) HashAggregate(keys=[], functions=[avg(cast(count#81 as double))])
    +- Exchange SinglePartition
       +- *(1) HashAggregate(keys=[], functions=[partial_avg(cast(count#81 as double))])
          +- LocalTableScan <empty>, [count#81].
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...