【问题标题】:Spark read from Entire Schema ScalaSpark 从整个 Schema Scala 中读取
【发布时间】:2021-02-03 04:21:24
【问题描述】:

我想创建一个 Spark 对象,该对象可以读取整个架构,而不仅仅是从该架构中读取一个表。这是因为我想执行一个连接多个表的特定查询(我不想单独从每个表中读取并使用 Spark 手动重新创建查询,因为查询又长又复杂)。我希望它会像这样工作:

val Schema_DF = spark.read
    .format("jdbc")
    .option("url", "jdbc://example.com")
    .option("schema", "SCHEMA_NAME")
    .option("user", "username")
    .option("password", "pass")
    .load()

我可以使用不同的方法将我想要的查询加载为 ResultSet,但这似乎很冗长,因为我需要将其转换为 Dataframe。任何帮助将不胜感激。

干杯

【问题讨论】:

  • 您的方法会加载单个数据框,因此确实不会加载所有表。你检查了stackoverflow.com/questions/54493740/… 吗? - 我知道它是 Python,但对于 Scala 来说几乎是一样的
  • 加载所有表然后在 Spark 中进行连接的目的是什么?直接在数据库上做不是更有效率吗?还是我在您的工作流程中遗漏了什么?
  • 您好,感谢您的评论。我已经将每个表单独加载为单独的数据框,并在 Spark 中手动完成连接。这个问题的目的是能够按原样执行整个查询,并验证我在 Spark 中所做的手动连接是否生成了正确的输出。我已经能够执行查询并将结果存储为 Scala 中的 ResultSet,但是很难将 ResultSet 与 Dataframe 进行比较 - 因此我试图将整个 Schema 作为 Dataframe 连接,以便我的两个表属于同一类型。让我知道这是否有意义?

标签: scala dataframe apache-spark schema


【解决方案1】:

您无需将整个架构加载到 spark 中即可。

您可以使用query 属性查询您的数据库并以数据框的形式获取结果。

val jdbcDF = spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("query", "select c1, c2 from t1")
.load()

参考:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

注意:Spark 会将此查询推送到您的数据库,即您的数据库将处理该查询,而 Spark 只会获取结果。如果它是您的实时产品数据库,请小心:)

【讨论】:

  • 谢谢!!如果一个较小的查询,这很好用,但每次我用一个更大的查询尝试它时,我都会收到一个错误:com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-199, SQLSTATE=42601, SQLERRMC=WITH;HAVING INTERSECT MINUS EXCEPT UNION FETCH OVER CONCAT || / - +, DRIVER=3.72.44 确切的查询在客户端上运行良好,但当我尝试通过 Spark 加载它时失败。有什么想法吗?
  • 已投票,只是没有太多声誉:) 不幸的是,我无法显示查询,因为它很长并且包含机密信息,但它基本上只是一系列左连接,左外连接和一些 WHERE标准
  • 在没有看到查询的情况下真的帮不上忙。几点建议:(1)。尝试像 spark 那样运行查询,即SELECT <columns> FROM (<user_specified_query>) spark_gen_alias。用您的查询替换 <user_specified_query> 并在客户端中尝试。 (2)检查是否有任何破坏查询的转义或引号(3)最坏的情况:从较小的查询开始,并在火花中不断纠正它并慢慢使其复杂
  • 感谢您的帮助。 (2) 目前是我正在做的事情
猜你喜欢
  • 2017-06-21
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2010-11-20
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多