我一直在尝试不同的方法来过滤输入的数据集。结果表明,性能可能会有很大差异。
该数据集是基于1.6 GB的33列和4226047行数据创建的。数据集通过加载csv数据并映射到一个case类来创建。
val df = spark.read.csv(csvFile).as[FireIncident]
对 UnitId = 'B02' 的筛选应该返回 47980 行。我测试了以下三种方法: 1)使用类型化列(在本地主机上约为 500 毫秒)
df.where($"UnitID" === "B02").count()
2) 使用临时表和SQL查询(与选项1几乎相同)
df.createOrReplaceTempView("FireIncidentsSF")
spark.sql("SELECT * FROM FireIncidentsSF WHERE UnitID='B02'").count()
3) 使用强类型类字段(14,987ms,即慢30倍)
df.filter(_.UnitID.orNull == "B02").count()
我用Python API再次测试了相同的数据集,时间为17,046毫秒,与Scala API选项3的性能相当。
df.filter(df['UnitID'] == 'B02').count()
能否有人解释一下第三个选项和python API与前两个选项执行方式的不同之处?
Dataset<Row>
,并且加上了这段代码:datasetRdd.filter(r -> r.<String>getAs("event_type_id").equals("LOG"))
,会发生什么? - Hedrack