使用Pyspark和SQL DB的最佳方法

时间:2017-04-10 10:35:09

标签: python apache-spark pyspark spark-dataframe pyspark-sql

我的SQL数据库有数百万条记录的表,其中一些有千万条记录,我的主要选择是大约4000行代码,但结构是这样的:

SELECT A.seq field1, field2, field3, field4,
       (select field from tableX X... where A.seq = X.seq ...) field5,
       (select field from tableY Y... where A.seq = Y.seq ...) field6,
       (select field from tableN Z... where A.seq = Z.seq ...) field7,
       field8, field9
  FROM tableA A, tableB B, tableN N
 WHERE A.seq = B.seq
   AND A.req_seq = N.req_seq;

我的想法是做这样的事情:

# load the tables in the cluster separately

conf = SparkConf().setAppName("MyApp")
sc = SparkContext(master="local[*]", conf=conf)
sql = HiveContext(sc)    

dataframeA = sql.read.format("jdbc").option("url",
                                    "db_url")\
    .option("driver", "myDriver")\
    .option("dbtable", tableA)\
    .option("user", "myuser")\
    .option("password", "mypass").load()

dataframeB = sql.read.format("jdbc").option("url",
                                    "db_url")\
    .option("driver", "myDriver")\
    .option("dbtable", tableC)\
    .option("user", "myuser")\
    .option("password", "mypass").load()

dataframeC = sql.read.format("jdbc").option("url",
                                    "db_url")\
    .option("driver", "myDriver")\
    .option("dbtable", tableC)\
    .option("user", "myuser")\
    .option("password", "mypass").load()

# then do the needed joins

df_aux = dataframeA.join(dataframeB, dataframeA.seq == dataframeB.seq)

df_res_aux = df_aux.join(dataframeC, df_aux.req_seq == dataframeC.req_seq)


# then with that dataframe calculate the subselect fields

def calculate_field5(seq):
    # load the table in the cluster as with the main tables 
    # and query the datafame
    # or make the query to DB and return the field
    return field

df_res = df_res_aux.withColumn('field5', calculate_field5(df_res_aux.seq))
# the same for the rest of fields

这是一个好方法吗? 我应该以不同的方式接近吗?

任何建议都会非常,非常感谢

1 个答案:

答案 0 :(得分:0)

那么,

如果你想在执行中使用MySql,可以这样做。

但请注意,由于mySql查询时间,执行可能需要花费大量时间才能运行。 MySql不是分布式数据库,因此您可以花大量时间从mySql中检索数据。

我建议你。

尝试将数据检索到hdfs(如果您有HDFS),请尝试使用SqoopHere一个例子,说明如何以增量方式使用它。

尝试将存储为Orc的数据转换为。请参阅示例here

此建议是为了减少数据库的执行时间。每次从MySql直接请求数据。您正在使用MySql的资源将数据发送到Spark。按照我建议的方式,您可以将数据库复制到HDFS并将此数据带到Spark进行处理。这不会导致数据库执行时间。

为什么要使用Orc? Orc是以紧凑和柱状结构转换数据的不错选择。这将增加您的数据检索和搜索。