当前位置: 首页 > 知识库问答 >
问题:

从SQL查询创建Spark数据框

邴景山
2023-03-14

我确信这是一个简单的SQLContext问题,但我在Spark docs或Stackoverflow中找不到任何答案

我想从MySQL上的SQL查询创建一个Spark数据框

例如,我有一个复杂的MySQL查询,如

SELECT a.X,b.Y,c.Z FROM FOO as a JOIN BAR as b ON ... JOIN ZOT as c ON ... WHERE ...

我想要一个带有X、Y和Z列的数据帧

我想出了如何将整个表加载到Spark中,然后可以将它们全部加载,然后在那里进行连接和选择。然而,这是非常低效的。我只想加载SQL查询生成的表。

这是我当前代码的近似值,这不起作用。MySQL连接器有一个选项“dbtable”,可用于加载整个表。我希望有某种方法可以指定查询

  val df = sqlContext.format("jdbc").
    option("url", "jdbc:mysql://localhost:3306/local_content").
    option("driver", "com.mysql.jdbc.Driver").
    option("useUnicode", "true").
    option("continueBatchOnError","true").
    option("useSSL", "false").
    option("user", "root").
    option("password", "").
    sql(
"""
select dl.DialogLineID, dlwim.Sequence, wi.WordRootID from Dialog as d
join DialogLine as dl on dl.DialogID=d.DialogID
join DialogLineWordInstanceMatch as dlwim o n dlwim.DialogLineID=dl.DialogLineID
join WordInstance as wi on wi.WordInstanceID=dlwim.WordInstanceID
join WordRoot as wr on wr.WordRootID=wi.WordRootID
where d.InSite=1 and dl.Active=1
limit 100
"""
    ).load()

共有3个答案

苍嘉澍
2023-03-14

要将查询的输出保存到新的数据帧,只需将结果设置为变量:

val newDataFrame = spark.sql("SELECT a.X,b.Y,c.Z FROM FOO as a JOIN BAR as b ON ... JOIN ZOT as c ON ... WHERE ...")

现在newDataFrame是一个具有所有可用数据帧功能的数据帧。

孟海
2023-03-14

如果您已经在SQLContext中注册了表,那么只需使用sql方法即可。

val resultDF = sqlContext.sql("SELECT a.X,b.Y,c.Z FROM FOO as a JOIN BAR as b ON ... JOIN ZOT as c ON ... WHERE ...")
阎元徽
2023-03-14

我在这里发现了这个通过Spark的批量数据迁移SQL

dbname参数可以是任何用别名包装在括号中的查询。所以在我的例子中,我需要这样做:

val query = """
  (select dl.DialogLineID, dlwim.Sequence, wi.WordRootID from Dialog as d
    join DialogLine as dl on dl.DialogID=d.DialogID
    join DialogLineWordInstanceMatch as dlwim on dlwim.DialogLineID=dl.DialogLineID
    join WordInstance as wi on wi.WordInstanceID=dlwim.WordInstanceID
    join WordRoot as wr on wr.WordRootID=wi.WordRootID
    where d.InSite=1 and dl.Active=1
    limit 100) foo
"""

val df = sqlContext.format("jdbc").
  option("url", "jdbc:mysql://localhost:3306/local_content").
  option("driver", "com.mysql.jdbc.Driver").
  option("useUnicode", "true").
  option("continueBatchOnError","true").
  option("useSSL", "false").
  option("user", "root").
  option("password", "").
  option("dbtable",query).
  load()

正如所料,将每个表作为其自己的数据帧加载并将它们连接到Spark中效率非常低。

 类似资料:
  • 这是获得SQL结果集的一个非常常见的方法,因为一对多的关系······对于一个相当简单的结构执行冗余查询似乎是不必要的(而且可能是低效的)。是否有一种已建立的简单的方法将其解析为java对象?也就是说,我不想迭代ResultSet类并为每一行创建和设置一个新对象,而是要迭代集合并为每一个父行创建一个新对象,为每一个子行创建一个新对象。 例如,一种方法是按父主键对查询进行排序,然后仅当父id更改时才

  • 我在Mariadb有大量的数据。我需要从查询创建转储文件。到目前为止我有这样的东西。

  • 问题内容: 因此,我试图通过SQL查询从Oracle SQL表中的数据创建一个 概率密度函数 。因此请考虑下表: 现在,如果我想根据该数据创建PDF,则需要计算每个客户在特定数量(0到50或50到100之间)花费的次数。一个示例图看起来像这样(原谅我可怜的ascii艺术): 因此,轴为: X轴:是水桶 Y轴:是客户数量 我目前正在使用Oracle SQL CASE函数 来确定支出是否在存储桶之内,

  • 我正在尝试使用Apache Spark,以便将具有多个连接和子选择的(大型)SQL查询的结果加载到来自Spark的DataFrame中,如从SQL查询创建Spark Dataframe中所述。 不幸的是,我这样做的尝试导致了拼花错误: 线程“main”组织中出现异常。阿帕奇。火花sql。AnalysisException:无法推断拼花地板的架构。必须手动指定。 我从谷歌看到的信息表明,当数据帧为空

  • 问题内容: 我有两个表命名和 我需要获得输出 问题答案: 此数据转换称为A ,从SQL Server 2005开始,具有将数据从行转换为列的功能。 有多种方法可以完成此操作,具体取决于您是否有要转换为列的静态数量的值。所有这些都涉及向数据添加a ,因此您可以返回任何产品的多行。 您可以将聚合函数与表达式一起使用: 参见带有演示的SQL Fiddle 您可以使用以下功能: 请参阅带有演示的SQL F

  • 如何查询具有复杂类型(如映射/数组)的RDD?例如,当我编写此测试代码时: 我认为语法应该是这样的: 或 但我明白了 无法访问类型MapType(StringType,StringType,true)中的嵌套字段 和 组织。阿帕奇。火花sql。催化剂错误。包$TreeNodeException:未解析的属性 分别地