最近在做將sqlserver的數據遷移到redshift上面,然后再做的過程當中出現了很多問題。(通過sqlserver 讀取數據,然后寫成json文件然后長傳到S3上面,然后通過S3copy的形式將數據寫入到redshift上面)
第一次通過csv的形式然后通過s3copy的形式將數據長傳,里面出險了一些特殊的字符(比如\n \t \r)就很坑爹,這就是csv不好的地方。
具體看下面這篇博客(https://blog.csdn.net/qq_39188891/article/details/90480907)
遇到的問題1:
使用pands讀取sql,然后將數據轉成json之后,發現redshift不能加載直接轉成的json。
轉成的json格式,出險了上面的兩遍帶有[]的標識而且中間有逗號分隔,這樣的json數據不能被redshift識別。要想識別還得重新對數據進行清洗。
問題2:
通過下面的這種方式讀取的數據,然后將每一行的數據轉成一個dataframe的形式再寫成json的形式,然后把文件打開然后再將數據寫入到文件當中。
但是這種的數據在逐條寫入的時候,速度就特別的慢。40萬的數據,寫了一個小時沒寫完。
connect = pymssql.connect(host=sqlserver_host, user=sqlserver_username,
password=sqlserver_pwd, database=sqlserver_dbname, port=sqlserver_port) # 建立連接
cursor = connect.cursor()
if connect:
print("sqlserver連接成功!")
sql = '''select * from %s a''' % (sqlserver_script)
print(sql)
cursor.execute(sql) # 執行sql語句
columnDes = cursor.description # 獲取連接對象的描述信息
columnNames = [columnDes[i][0] for i in range(len(columnDes))]
rs = cursor.fetchall()
f = open('/data/etl_log/sqlserver_data/{name}.json'.format(name=sqlserver_script), 'a')
count=0
for i in rs:
df = pd.DataFrame([list(i)], columns=columnNames)
#df = df.applymap(lambda x: str(x).replace('\r', '').replace('\n', '').replace('\t', ''))
#df = df.applymap(replace_func,axis=0)
ss = df.to_json(orient='records').replace('[', '').replace(']', '')
f.write(ss+'\n')
print(count)
count+=1
f.close()
讀取速度慢的原因,一條數據在轉成df的時候產生了很多對象。這個導致內存不能釋放,所以速度很慢
最終的解決方案是通過map的形式將數據轉成一個list,然后做成字典的形式,然后轉化為json,然后寫入到文件當中這樣的速度還可以,40萬的數據差不多10分鍾不到。
for i in rs: list_ = list(map(lambda x: str(x).replace('\t', '').replace('\n', '').replace('\r', ''), i)) ss = json.dumps(dict(zip(columnNames, list_))) f.write(ss+'\n') print(count) count+=1
至此問題得到解決。