通過Python讀取sqlserver數據寫成json文件的總結


最近在做將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

 


至此問題得到解決。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM