从两个现有表A和B创建一个新表,A具有1年的历史数据,B具有ID的数据。我需要使用Spark将这两个表结合在一起,其中的性能很好,并需要将每一天或每个月的数据循环,因为business_day是分区。我不能考虑整个表,因为每个工作日每个工作日都有3000万。
表A-具有n列,例如ID,Business_Day,Name
表B-具有n列-ID,ID_Code
表A应该使用ID=ID
连接表B,并获得ID_Code以及表A的其他列
insert into output_table
select ID, ID_CODE,Business_Day, Name
from A,B where
A.ID=B.ID
我不确定如何为上述代码编写For循环,插入脚本可以工作,但是一天要花2个小时,而且我需要手动更改工作日一年,这是不可能的,但是会产生循环和其他性能步骤将帮助它更快地运行。
答案 0 :(得分:1)
使用Python生成Spark SQL查询
from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
import pandas as pd
sc = SparkContext(conf=SparkConf())
sqlContext = SQLContext(sc)
# Table A read and spark create dataframe --> df_A
# df_A = sqlContext.createDataFrame(...)
# Table B read and spark create dataframe --> df_B
# df_B = sqlContext.createDataFrame(...)
# Example:
df1 = sqlContext.createDataFrame(
pd.DataFrame.from_records(
[
[1,12,'Test'],
[2,22,'RD']
],
columns=['ID','ID_CODE','Departman']
))
df2 = sqlContext.createDataFrame(
pd.DataFrame.from_records(
[
[1,'friday','Shan'],
[2,'friday','ramazan'],
[3,'friday','bozkir']
],
columns=['ID','Business_Day','Name']))
### pyspark method SQL
df = df_A.join(df_B,df_B.ID == df_A.ID)
.select('ID_CODE','Business_Day','Name')
### Spark SQL method
df1.registerTempTable('df_A')
df2.registerTempTable('df_B')
df = sqlContext.sql("""
SELECT ID_CODE,Business_Day,Name
FROM (
SELECT *
FROM df_A A LEFT JOIN df_B B ON B.ID = A.ID
) df
""")
""").show()
[In]: df.show()
[Out]:
+-------+------------+-------+
|ID_CODE|Business_Day| Name|
+-------+------------+-------+
| 12| friday| Shan|
| 22| friday|ramazan|
+-------+------------+-------+