有啥方法可以让我在一个 pyspark 脚本中从 10 个不同的模式中提取数据?

Posted

技术标签:

【中文标题】有啥方法可以让我在一个 pyspark 脚本中从 10 个不同的模式中提取数据?【英文标题】:Is there any method through which i can pull data from 10 different schemas in one pyspark script?有什么方法可以让我在一个 pyspark 脚本中从 10 个不同的模式中提取数据? 【发布时间】:2020-05-19 07:42:31 【问题描述】:

我在 SQL 服务器上有一些数据,这些数据存储在 10 个不同的模式中。虽然表结构在所有模式中都是相同的。有什么方法可以让我在一个 pyspark 脚本中提取所有数据? 一种替代方法是为 10 个模式创建 10 个数据框,然后合并所有,这将需要我访问 sql server 10 次。比如这样的:

df1 = spark.sql("""select id, name, address from schema_1.personal_details""") \
      spark.read(db_details)

df2 = spark.sql("""select id, name, address from schema_2.personal_details""") \
      spark.read(db_details)

df3 = spark.sql("""select id, name, address from schema_3.personal_details""") \
      spark.read(db_details)

像这样,10个不同的schema,然后做union。

我正在寻找的是通过一次访问数据库来收集一个/所需数据帧中的所有数据,这可能是通过使用 for 循环或其他方式。

注意:不能使用 sqoop,因为我必须创建 10 个不同的 sqoop 脚本(根据我们的架构)。

请帮忙。

【问题讨论】:

【参考方案1】:

您可以在 sql server 本身上执行 unionall 操作,然后将数据返回到 spark 中,这样您只需访问 db 一次。即使您尝试遍历模式,您仍然会多次访问 db。

所以你可以像这样创建查询

select id, name, address from schema_1.personal_details
union all
select id, name, address from schema_2.personal_details
union all
select id, name, address from schema_3.personal_details

and so on..

然后在 spark jdbc 中运行这个查询

spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("query", yourUnionallQuery)
.load()

【讨论】:

以上是关于有啥方法可以让我在一个 pyspark 脚本中从 10 个不同的模式中提取数据?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以在 Linux/AIX 中从 ksh 更改进程名称?

PySpark 和 Spark 有啥区别?

有啥方法可以让 curl 连接并让我在输入时输入和发送身体片段?

有啥方法可以在 pyspark 数据框中找到包含数据的列数

有啥方法可以在 Kotlin 中从同一个通用接口继承两次(使用不同的类型)?

有啥方法可以在 php 的返回页面中从 PayPal 获取交易详细信息?