use*_*961 31 dataframe apache-spark
我昨天刚开始使用DataFrame,到目前为止我真的很喜欢它.
我不明白一件事......(请参阅"以编程方式指定架构"下的示例:https://spark.apache.org/docs/latest/sql-programming-guide.html#programmatically-specifying-the -schema)
在这个例子中,数据帧被注册为一个表(我猜测是为了提供对SQL查询的访问......?)但是正在访问的完全相同的信息也可以由peopleDataFrame.select("name")来完成.
所以问题是..你想什么时候将数据帧注册为表而不是仅仅使用给定的数据帧函数?并且一种选择比另一种更有效吗?
rak*_*ake 29
将该registerTempTable( tableName )方法用于DataFrame 的原因是,除了能够使用Spark提供的方法之外DataFrame,还可以通过该sqlContext.sql( sqlQuery )方法发出SQL查询,该方法将该DataFrame用作SQL表.该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()
Run Code Online (Sandbox Code Playgroud)
是否使用SQL或DataFrame方法select,groupBy可能主要是偏好问题.我的理解是SQL查询被转换为Spark执行计划.
在我的例子中,我发现我需要的某些类型的聚合和窗口查询,例如计算每个客户的运行余额,在Hive SQL查询语言中可用,我怀疑在Spark中很难做到.
如果你想使用SQL,那么你很可能想要创建一个HiveContext而不是常规的SQLContext.Hive查询语言支持比通过plain提供的更广泛的SQL SQLContext.
例如,将数据帧加载到笔记本中的临时视图中很方便,您可以在其中对数据运行探索性查询:
df.createOrReplaceTempView("myTempView")
Run Code Online (Sandbox Code Playgroud)
然后在另一个笔记本中,您可以运行 sql 查询并获得开箱即用的所有出色的集成功能,例如表格和图形可视化等。
%sql
SELECT * FROM myTempView
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32119 次 |
| 最近记录: |