工程的博客

Spark SQL:使用Apache Spark操作结构化数据

2014年3月26日 工程的博客

分享这篇文章

搭建统一的平台bob体育客户端下载大数据分析一直以来都是Apache Spark的愿景,允许单个程序执行ETL,MapReduce以及复杂的分析。我们的用户一直要求的统一的一个重要方面是能够更容易地导入存储在外部源中的数据,例如Apache蜂巢.今天,我们很高兴地宣布火花SQL,一个新组件最近合并到Spark存储库中。

Spark SQL为Spark带来了对SQL的本地支持,并简化了查询存储在rdd (Spark的分布式数据集)和外部数据源中的数据的过程。Spark SQL方便地模糊了rdd和关系表之间的界限。统一这些强大的抽象使开发人员可以很容易地将查询外部数据的SQL命令与复杂的分析混合在一起,所有这些都在一个应用程序中。具体来说,Spark SQL将允许开发人员:

  • 从Parquet文件和Hive表导入关系数据
  • 对导入的数据和现有rdd运行SQL查询
  • 轻松地将rdd写入Hive表或Parquet文件

Spark SQL In Action

现在,让我们仔细看看Spark SQL如何为开发人员提供将SQL命令集成到应用程序中的能力,这些应用程序也利用了Spark的MLlib机器学习库.考虑一个应用程序,它需要根据用户的概要来预测哪些用户可能是服务的候选者。通常,这样的分析需要连接来自多个来源的数据。为了便于说明,假设一个应用程序有两个表:

  • 用户(userId INT,名称字符串,电子邮件字符串,
    年龄INT,纬度:DOUBLE,经度:DOUBLE,
    订阅:布尔)
  • 事件(用户id INT,动作INT)

考虑到这些表中存储的数据,人们可能想要建立一个模型,根据相似的用户来预测哪些用户是新活动的好目标。

//数据可以很容易地从现有来源提取,
//例如Apache Hive。
val trainingDataTable = sql(""" "
选择e.action
u.age,
u.latitude,
u.logitude
来自用户u
参加活动e
ON u.userId = e.userId""" ")

/ /自sql返回一个RDD,上面的结果
//查询可以在MLlib中轻松使用
val trainingData = trainingDataTable。映射{row =>
val features = Array[Double](row(1), row(2), row(3))
LabeledPoint(行(0),功能)

Val模型=
新的LogisticRegressionWithSGD () .run (trainingData)

现在我们已经使用SQL来连接现有数据并训练模型,我们可以使用这个模型来预测哪些用户可能是目标用户。

val allcandidate = sql(""" "
选择userId,
的年龄,
纬度,
logitude
从用户
WHERE订阅= FALSE""" ")

// ML算法的结果可以作为表格
//在后续的SQL语句中。
案例类得分(userId: Int,得分:Double)
val scores = allcandidate。映射{row =>
val features = Array[Double](row(1), row(2), row(3))
评分(行(0),model.predict(特性))

scores.registerAsTable(“分数”)

val topcandidate = sql(""" "
选择u.name, u.email
FROM分数
加入用户u ON s.u userid = u.u userid
按分数排序
限制100”“”)

//向最佳候选人发送电子邮件,推广该服务。

在这个例子中,Spark SQL使得提取和连接各种数据集变得很容易,为机器学习算法做好了准备。由于Spark SQL的结果也存储在rdd中,因此与其他Spark库的接口是微不足道的。此外,Spark SQL允许开发人员通过使其易于操作和连接这些算法的输出来关闭循环,从而产生所需的最终结果。

总而言之,统一的Spark平台为开发人员提供了为正确的工作选择正bob体育客户端下载确工具的能力,而不必在多个系统之间来回切换。如果您想看到更多使用Spark SQL的具体示例,请查看编程指南

催化剂优化

除了提供与数据交互的新方法外,Spark SQL还带来了一个名为Catalyst的强大优化框架。使用Catalyst, Spark可以自动转换SQL查询,使其执行更有效。Catalyst框架允许Spark SQL背后的开发人员快速添加新的优化,使我们能够更快地构建一个更快的系统。在最近的一个例子中,我们发现Hive group-bys的效率低下,需要一个有经验的开发人员花费整个周末和超过250行代码来修复;然后,我们就可以在Catalyst中仅用几行代码就完成相同的修复。

鲨鱼的未来

随之而来的自然问题是关于Shark的未来。Shark是第一批提供100倍于Hive的加速系统之一。它构建在Apache Hive代码库上,通过交换Hive的物理执行引擎部分来实现性能改进。虽然这种方法可以让Shark用户在不修改现有仓库的情况下加速Hive查询,但Shark继承了Hive庞大而复杂的代码库,这使得它难以优化和维护。随着Spark SQL的成熟,Shark将过渡到使用Spark SQL进行查询优化和物理执行,这样用户就可以从Spark SQL中正在进行的优化工作中受益。

简而言之,我们将继续投资Shark,使其成为Apache Hive的绝佳替代品。它将利用新的Spark SQL组件,并将提供补充功能,如Hive兼容性和独立的SharkServer,它允许外部工具通过JDBC/ODBC连接查询。

接下来是什么

Spark SQL将作为alpha组件包含在Spark 1.0中。然而,这只是Spark中更好地支持关系数据的开始,这篇文章只是触及了Catalyst的表面。请关注以下主题的博客文章:

  • 生成自定义字节码以加速表达式求值
  • 使用其他格式和系统进行数据读写,包括Avro和HBase
  • API支持在Python和Java中使用Spark SQL
免费试用Databricks
看到所有工程的博客的帖子