我昨天刚开始使用DataFrame,到目前为止我真的很喜欢它。
我不明白一件事...... (参考&#34下的示例;以编程方式指定架构"此处:https://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the-schema)
在这个例子中,数据帧被注册为一个表(我猜是为了提供对SQL查询的访问......?)但是正在访问的完全相同的信息也可以由peopleDataFrame.select完成(" name& #34;。)
所以问题是..你想什么时候将数据帧注册为表而不是仅使用给定的数据帧函数?并且一种选择比另一种更有效吗?
答案 0 :(得分:28)
对DataFrame使用registerTempTable( tableName )
方法的原因是,除了能够使用Spark提供的DataFrame
方法之外,您还可以通过{发出SQL查询{1}}方法,将该DataFrame用作SQL表。 sqlContext.sql( sqlQuery )
参数指定在SQL查询中用于该DataFrame的表名。
tableName
是否使用SQL或DataFrame方法(如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()
和select
)可能主要是偏好问题。我的理解是SQL查询被转换为Spark执行计划。
在我的情况下,我发现我需要的某些类型的聚合和窗口查询,比如计算每个客户的运行余额,在Hive SQL查询语言中可用,我怀疑在Spark中很难做到
如果您想使用SQL,那么您很可能想要创建groupBy
而不是常规HiveContext
。 Hive查询语言支持比通过普通SQLContext
提供的更广泛的SQL。
答案 1 :(得分:0)
有一个很好的基准比较RDD与数据帧和SparkSQL性能:
Spark RDDs vs DataFrames vs SparkSQL
显然,使用SparkSQL对GroupBy进行计数和排序的速度明显加快。
如果你有一项关键任务工作,那么将两者都用来比较时间和性能可能是有意义的。
答案 2 :(得分:0)
例如,将数据帧加载到笔记本中的临时视图中非常方便,您可以在其中对数据运行探索性查询:
df.createOrReplaceTempView("myTempView")
然后在另一个笔记本中,您可以运行sql查询并获得开箱即用的所有出色集成功能,例如表格和图形可视化等。
%sql
SELECT * FROM myTempView