10億レベルのドリスデータベースを読み取る方法 | JD Cloud技術チーム

  1. 職場では、オンラインのドリスを市場に同期させる必要があることがよくあります。doris データの読み取りは、通常の mysql の読み取りと基本的に同じです。データ行が 1,000 万未満の場合は、単一ノードに直接接続し、読み取り、保存することが比較的簡単です。Python の例は次のとおりです。
def get_data(sql,host='',port=2000,user='',password='',db=''):
    # 支持doris
    import pymysql
    connect = pymysql.connect(host=host,port=port,user=user,password=password,db=db,charset='utf8')
    cursor = connect.cursor()
    cursor.execute('SET query_timeout = 216000;') #单位秒
    cursor.execute(sql)
    result = cursor.fetchall()
    for row in result:
        pass # 存储格式可以自行控制 
    cursor.close()
    connect.close()
    return result
  1. データの量が比較的多く、1,000 万、さらには 1 億を超える場合、単一ノードの読み取りではタイムアウトや適時性の低さの問題が発生します。spark.read.jdbc を使用して、複数ノードの同時読み取りを分散できます。Spark 読み取りは 2 つの方法をサポートしています。

主なパラメータの紹介:

read.jdbc(url=url,table=remote_table,column='item_sku_id',numPartitions=50,lowerBound=lowerBound, upperBound=upperBound,properties=prop)

URL: 「jdbc: mysql://**.jd.com:2000/database name?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai」のよう形式

table: テーブル名またはクエリ SQL を指定できます (つまり、条件付きクエリをサポートします)。SQL の場合、形式は次のようになります。「(SELECT count(*) sku FROM rules_price_result where dt='2023-05-10'」 ) AS tmp"

numPartitions: 同時ノードの数を制御します

lowerBound+upperBound およびプロパティのいずれかを選択して、各ノードによって読み取られるデータの範囲を制御します。

lowerBound+upperBound モード: 読み取る最小値と最大値を指定すると、Spark はパーティションの数と最小値と最大値の境界を組み合わせて機械的に分割します。

データの分布が偏っている場合は、述語リストを使用して範囲を自分で制御できます。

著者: JD Retail 趙啓蒙

出典: JD Cloud 開発者コミュニティ

{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10085066