Python 如何从同一数据库中读取多个表并将它们保存到自己的CSV文件中?

Python 如何从同一数据库中读取多个表并将它们保存到自己的CSV文件中?,python,csv,apache-spark,apache-spark-sql,pyspark-sql,Python,Csv,Apache Spark,Apache Spark Sql,Pyspark Sql,下面是连接到SQL server并将1个表保存为CSV格式文件的工作代码 conf = new SparkConf().setAppName("test").setMaster("local").set("spark.driver.allowMultipleContexts", "true"); sc = new SparkContext(conf) sqlContext = new SQLContext(sc) df = sqlContext.read.format("jdbc").optio

下面是连接到SQL server并将1个表保存为CSV格式文件的工作代码

conf = new SparkConf().setAppName("test").setMaster("local").set("spark.driver.allowMultipleContexts", "true");
sc = new SparkContext(conf)
sqlContext = new SQLContext(sc)
df = sqlContext.read.format("jdbc").option("url","jdbc:sqlserver://DBServer:PORT").option("databaseName","xxx").option("driver","com.microsoft.sqlserver.jdbc.SQLServerDriver").option("dbtable","xxx").option("user","xxx").option("password","xxxx").load()

df.registerTempTable("test")
df.write.format("com.databricks.spark.csv").save("poc/amitesh/csv")
exit()
我有一个场景,在这个场景中,我必须通过pyspark代码将同一数据库中的4个表以CSV格式保存在4个不同的文件中。我们是否有办法实现目标?或者,这些拆分是在HDFS块大小级别完成的,因此,如果您有一个300mb的文件,并且HDFS块大小设置为128,那么您将得到3个分别为128mb、128mb和44mb的块

在这里,我必须通过pyspark代码将同一数据库中的4个表以CSV格式保存在4个不同的文件中

必须为数据库中的每个表编写转换代码(读写)(使用
sqlContext.read.format

表特定ETL管道之间的唯一区别是每个表有一个不同的
dbtable
选项。拥有数据帧后,将其保存到自己的CSV文件中

代码可以如下所示(在Scala中,因此我将其转换为Python作为一个家庭练习):

对要保存到CSV的每个表重复相同的代码

完成了

100表案例-公平调度 解决方案还需要另一个:

如果我有100张或更多的桌子怎么办?如何为此优化代码?如何在Spark中有效地执行此操作?有并行化吗

SparkContext
位于我们用于ETL管道的
SparkSession
后面的是线程安全的,这意味着您可以从多个线程使用它。如果您考虑每个表一个线程,这是正确的方法

您可以生成尽可能多的线程,比如100个,然后启动它们。Spark可以决定执行什么以及何时执行

这是Spark使用的东西。在本例中,Spark的这一特性并不广为人知,值得考虑:

在给定的Spark应用程序(SparkContext实例)中,如果多个并行作业是从单独的线程提交的,则它们可以同时运行。在本节中,我们所说的“作业”是指Spark操作(例如保存、收集)以及需要运行以评估该操作的任何任务。Spark的调度程序是完全线程安全的,并支持此用例,以支持服务于多个请求(例如,多用户查询)的应用程序


使用它,您的加载和保存管道可能会更快。

什么是Spark版本?是的,我知道了,它对我有用。但是当我们有100个表时,如何优化我们的代码呢?我们是否可以使用与python相关的函数?Spark parallelize在这里有用吗?我建议使用FIFO调度程序而不是FAIR调度程序。此外,我将实例化一个并行映射集合(表名,csv路径),然后将数据帧读/写映射到并行集合上,以生成作业。@RickMoritz“我建议使用FIFO调度程序而不是公平调度程序。”为什么?据我所知,公平调度器将尝试以循环方式从所有作业中调度阶段,而FIFO的目标是完成首先排队的作业,同时将集群中的剩余容量用于后续作业的阶段。这样,你在飞行中的工作就少了,并且在更早的时候就有了一致的结果。当您在同一SparkSession中混合了长时间运行和交互式作业时,公平模式更适合您,这样您的短作业将保证在长作业的两个阶段之间运行。FIFO不排除一次运行多个作业。
val datasetFromTABLE_ONE: DataFrame = sqlContext.
  read.
  format("jdbc").
  option("url","jdbc:sqlserver://DBServer:PORT").
  option("databaseName","xxx").
  option("driver","com.microsoft.sqlserver.jdbc.SQLServerDriver").
  option("dbtable","TABLE_ONE").
  option("user","xxx").
  option("password","xxxx").
  load()

// save the dataset from TABLE_ONE into its own CSV file
datasetFromTABLE_ONE.write.csv("table_one.csv")