バルクは、私はユーバーのにVertica-pythonのパッケージを使用して、Pythonの使用にVerticaにCSVファイルからデータをインポートしようとしている
の質問1をユーバーのにVertica-pythonのパッケージを使ってPythonを使用してのVerticaに挿入します。問題は、空白のみのデータ要素がVerticaにNULLとしてロードされていることです。空のデータ要素だけをNULLとして読み込み、空ではない空白データ要素を空白として読み込むようにします。
たとえば、次の2行のCSVファイルは、( '1'、 'abc'、NULL、NULL)として読み込まれますが、 、 'abc'、 ''、NULL)。ここで
1,abc,,^M
1,abc, ,^M
はコードです:
# import vertica-python package by Uber
# source: https://github.com/uber/vertica-python
import vertica_python
# write CSV file
filename = 'temp.csv'
data = <list of lists, e.g. [[1,'abc',None,'def'],[2,'b','c','d']]>
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, escapechar='\\', doublequote=False)
writer.writerows(data)
# define query
q = "copy <table_name> (<column_names>) from stdin "\
"delimiter ',' "\
"enclosed by '\"' "\
"record terminator E'\\r' "
# copy data
conn = vertica_python.connect(host=<host>,
port=<port>,
user=<user>,
password=<password>,
database=<database>,
charset='utf8')
cur = conn.cursor()
with open(filename, 'rb') as f:
cur.copy(q, f)
conn.close()
質問2 2
の私はロードのこの方法を使用するために注意する必要があり、他の問題(例えば文字エンコーディング)がありますデータをVerticaに入力しますか?コードに間違いがありますか?私は100%がすべてのプラットフォーム(現在Linux上で動作している;他のプラットフォームではターミネータの問題が記録されているなど)で動作すると確信しているわけではありません。このコードをより堅牢にするための推奨事項は、非常に高く評価されます。
さらに、速度を犠牲にすることなく、最初にCSVファイルに書き込むのではなく、Pythonから直接オブジェクトを読み込むなど、Pythonからデータを一括してVerticaに挿入する方法がありますか?データ量は大きく、挿入ジョブの実行には数時間かかります。
ご協力いただきありがとうございます。
ありがとうございました!あなたの提案が3列目のNULLを ''で置き換えるのではないでしょうか?私は、次のようにデータをロードしようとしています:要素が空の場合、それをNULLとしてVerticaにロードします。要素が長さ> 0の空白文字列であれば、それをそのままVerticaにロードします。私は誤読ですか?質問の元の言葉がこの時点ではっきりしていなかったことを謝ります。 – verbatross
他のもの:これらの素晴らしい提案に感謝します!私の場合、レコードターミネータが必要です(Ubuntu)。いくつかのデータ要素に改行文字があります。行が拒否された場合の表を却下することは素晴らしい考えです。デーモンによる読み込みも素晴らしい。それが可能であることを認識していない。 – verbatross
申し訳ありませんが私は誤解しました。私はそれを行う方法について考えているが、私は今それをテストすることはできない。私はそれに戻ります。そして私はそれがまさしく私のビジネスのどれかではないことを知っていますが、私はそのようなフィールドにスペースを格納するという考えは本当に好きではありません。一般的には良いことではありません。 – woot