我的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
这是一个好方法吗? 我应该以不同的方式接近吗?
任何建议都会非常,非常感谢
答案 0 :(得分:0)
那么,
如果你想在执行中使用MySql,可以这样做。
但请注意,由于mySql查询时间,执行可能需要花费大量时间才能运行。 MySql不是分布式数据库,因此您可以花大量时间从mySql中检索数据。
我建议你。
尝试将数据检索到hdfs(如果您有HDFS),请尝试使用Sqoop。 Here一个例子,说明如何以增量方式使用它。
此建议是为了减少数据库的执行时间。每次从MySql直接请求数据。您正在使用MySql的资源将数据发送到Spark。按照我建议的方式,您可以将数据库复制到HDFS并将此数据带到Spark进行处理。这不会导致数据库执行时间。
为什么要使用Orc? Orc是以紧凑和柱状结构转换数据的不错选择。这将增加您的数据检索和搜索。