使用内部联接的大型表的Spark For循环

时间:2019-05-16 21:22:58

标签: pyspark

从两个现有表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个小时,而且我需要手动更改工作日一年,这是不可能的,但是会产生循环和其他性能步骤将帮助它更快地运行。

1 个答案:

答案 0 :(得分:1)

使用Python生成Spark SQL查询

Source

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|
+-------+------------+-------+