【发布时间】:2018-08-22 05:57:54
【问题描述】:
在 Databricks“社区版”上的 Python 笔记本中,我正在试验旧金山市有关向 911 请求消防员的紧急呼叫的开放数据。 ("Using Apache Spark 2.0 to Analyze the City of San Francisco's Open Data" (YouTube) 中使用的 2016 年旧数据副本,并在 S3 上为该教程提供。)
在装载数据并使用显式定义的架构将其读取到 DataFrame fire_service_calls_df 后,我将该 DataFrame 别名为 SQL 表:
sqlContext.registerDataFrameAsTable(fire_service_calls_df, "fireServiceCalls")
有了它和 DataFrame API,我可以计算发生的调用类型:
fire_service_calls_df.select('CallType').distinct().count()
Out[n]: 34
...或使用 Python 中的 SQL:
spark.sql("""
SELECT count(DISTINCT CallType)
FROM fireServiceCalls
""").show()
+------------------------+ |count(DISTINCT CallType)| +------------------------+ | 33| +------------------------+
...或使用 SQL 单元格:
%sql
SELECT count(DISTINCT CallType)
FROM fireServiceCalls
为什么我会得到两个不同的计数结果?(似乎 34 是正确的,尽管 talk in the video 和随附的教程笔记本提到“35 "。)
【问题讨论】:
-
如果你的
CallType是一个字符串,你能检查一下 SQL 是否正在(或不是)使char与varchar区别?当您计算不同的修剪值时会发生什么? -
SQL 中不同的计数通常会忽略空值。我敢打赌 DataFrame 会将它们视为不同的值。
-
只有 30 个值,您可以对所有不同的项目进行排序和打印,以查看差异在哪里。
-
@CharlesC 似乎是对的:
NULL似乎是问题所在。
标签: apache-spark pyspark apache-spark-sql pyspark-sql databricks