最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python腳本實(shí)現(xiàn)datax全量同步mysql到hive

 更新時(shí)間:2024年10月23日 10:28:48   作者:大數(shù)據(jù)編程之光  
這篇文章主要和大家分享一下mysql全量同步到hive自動生成json文件的python腳本,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參加一下

前言

在我們構(gòu)建離線數(shù)倉時(shí)或者遷移數(shù)據(jù)時(shí),通常選用sqoop和datax等工具進(jìn)行操作,sqoop和datax各有優(yōu)點(diǎn),datax優(yōu)點(diǎn)也很明顯,基于內(nèi)存,所以速度上很快,那么在進(jìn)行全量同步時(shí)編寫json文件是一項(xiàng)很繁瑣的事,是否可以編寫腳本來把繁瑣事來簡單化,接下來我將分享這樣一個(gè)mysql全量同步到hive自動生成json文件的python腳本。

一、展示腳本

# coding=utf-8
import json
import getopt
import os
import sys
import pymysql

# MySQL 相關(guān)配置,需根據(jù)實(shí)際情況作出修改
mysql_host = "XXXXXX"
mysql_port = "XXXX"
mysql_user = "XXX"
mysql_passwd = "XXXXXX"

# HDFS NameNode 相關(guān)配置,需根據(jù)實(shí)際情況作出修改
hdfs_nn_host = "XXXXXX"
hdfs_nn_port = "XXXX"

# 生成配置文件的目標(biāo)路徑,可根據(jù)實(shí)際情況作出修改
output_path = "/XXX/XXX/XXX"


def get_connection():
    return pymysql.connect(host=mysql_host, port=int(mysql_port), user=mysql_user, password=mysql_passwd)


def get_mysql_meta(database, table):
    connection = get_connection()
    cursor = connection.cursor()
    sql = "SELECT COLUMN_NAME,DATA_TYPE from information_schema.COLUMNS WHERE TABLE_SCHEMA=%s AND TABLE_NAME=%s ORDER BY ORDINAL_POSITION"
    cursor.execute(sql, [database, table])
    fetchall = cursor.fetchall()
    cursor.close()
    connection.close()
    return fetchall


def get_mysql_columns(database, table):
    return list(map(lambda x: x[0], get_mysql_meta(database, table)))


def get_hive_columns(database, table):
    def type_mapping(mysql_type):
        mappings = {
            "bigint": "bigint",
            "int": "bigint",
            "smallint": "bigint",
            "tinyint": "bigint",
            "decimal": "string",
            "double": "double",
            "float": "float",
            "binary": "string",
            "char": "string",
            "varchar": "string",
            "datetime": "string",
            "time": "string",
            "timestamp": "string",
            "date": "string",
            "text": "string"
        }
        return mappings[mysql_type]

    meta = get_mysql_meta(database, table)
    return list(map(lambda x: {"name": x[0], "type": type_mapping(x[1].lower())}, meta))


def generate_json(source_database, source_table):
    job = {
        "job": {
            "setting": {
                "speed": {
                    "channel": 3
                },
                "errorLimit": {
                    "record": 0,
                    "percentage": 0.02
                }
            },
            "content": [{
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": mysql_user,
                        "password": mysql_passwd,
                        "column": get_mysql_columns(source_database, source_table),
                        "splitPk": "",
                        "connection": [{
                            "table": [source_table],
                            "jdbcUrl": ["jdbc:mysql://" + mysql_host + ":" + mysql_port + "/" + source_database]
                        }]
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "defaultFS": "hdfs://" + hdfs_nn_host + ":" + hdfs_nn_port,
                        "fileType": "text",
                        "path": "${targetdir}",
                        "fileName": source_table,
                        "column": get_hive_columns(source_database, source_table),
                        "writeMode": "append",
                        "fieldDelimiter": "\t",
                        "compress": "gzip"
                    }
                }
            }]
        }
    }
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    with open(os.path.join(output_path, ".".join([source_database, source_table, "json"])), "w") as f:
        json.dump(job, f)


def main(args):
    source_database = ""
    source_table = ""

    options, arguments = getopt.getopt(args, '-d:-t:', ['sourcedb=', 'sourcetbl='])
    for opt_name, opt_value in options:
        if opt_name in ('-d', '--sourcedb'):
            source_database = opt_value
        if opt_name in ('-t', '--sourcetbl'):
            source_table = opt_value

    generate_json(source_database, source_table)


if __name__ == '__main__':
    main(sys.argv[1:])

二、使用準(zhǔn)備

1、安裝python環(huán)境

這里我安裝的是python3環(huán)境

sudo yum install -y python3

2、安裝EPEL

EPEL(Extra Packages for Enterprise Linux)是一個(gè)由 Fedora Special Interest Group 維護(hù)的軟件倉庫,提供了大量在官方 RHEL 或 CentOS 軟件倉庫中沒有的軟件包。當(dāng)你在 CentOS 或 RHEL 系統(tǒng)上需要安裝一些不在官方軟件倉庫中的軟件時(shí),通常會先安裝epel - release

sudo yum install -y epel-release

3、安裝腳本執(zhí)行需要的第三方模塊

pip3 install pymysql
pip3 install cryptography

這里可能由于斑紋問題cryptography安裝不上去更新一下pip和setuptools

pip3 install --upgrade pip
pip3 install --upgrade setuptools

重新安裝cryptography

pip3 install cryptography

三、腳本使用方法

1、配置腳本

首先根據(jù)自己服務(wù)器修改腳本相關(guān)配置

2、創(chuàng)建.py文件

vim /xxx/xxx/xxx/gen_import_config.py

3、執(zhí)行腳本

python3 /腳本路徑/gen_import_config.py -d 數(shù)據(jù)庫名 -t 表名

4、測試生成json文件是否可用

datax.py -p"-Dtargetdir=/表在hdfs存放路徑" /生成的json文件路徑

執(zhí)行時(shí)首先要確保targetdir目標(biāo)地址在hdfs上存在,如果沒有需要創(chuàng)建后再次執(zhí)行

到此這篇關(guān)于Python腳本實(shí)現(xiàn)datax全量同步mysql到hive的文章就介紹到這了,更多相關(guān)Python datax全量同步mysql到hive內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python實(shí)現(xiàn)一個(gè)優(yōu)雅的異步定時(shí)器

    使用Python實(shí)現(xiàn)一個(gè)優(yōu)雅的異步定時(shí)器

    在 Python 中實(shí)現(xiàn)定時(shí)器功能是一個(gè)常見需求,尤其是在需要周期性執(zhí)行任務(wù)的場景下,本文給大家介紹了基于 asyncio 和 threading 模塊,可擴(kuò)展的異步定時(shí)器實(shí)現(xiàn),需要的朋友可以參考下
    2025-04-04
  • Python Color類與文字繪制零基礎(chǔ)掌握

    Python Color類與文字繪制零基礎(chǔ)掌握

    這篇文章主要介紹了Python Color類與文字繪制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • python?協(xié)程并發(fā)數(shù)控制

    python?協(xié)程并發(fā)數(shù)控制

    這篇文章主要介紹了python?協(xié)程并發(fā)數(shù)控制,文章基于python的相關(guān)資料展開對主題煩人詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • python神經(jīng)網(wǎng)絡(luò)MobileNetV3?small模型的復(fù)現(xiàn)詳解

    python神經(jīng)網(wǎng)絡(luò)MobileNetV3?small模型的復(fù)現(xiàn)詳解

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)MobileNetV3?small模型的復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Django高級編程之自定義Field實(shí)現(xiàn)多語言

    Django高級編程之自定義Field實(shí)現(xiàn)多語言

    這篇文章主要介紹了Django高級編程之自定義Field實(shí)現(xiàn)多語言,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python 爬蟲如何實(shí)現(xiàn)百度翻譯

    python 爬蟲如何實(shí)現(xiàn)百度翻譯

    這篇文章主要介紹了python 爬蟲 簡單實(shí)現(xiàn)百度翻譯的示例,幫助大家更好的理解和使用python 爬蟲,感興趣的朋友可以了解下
    2020-11-11
  • Python爬蟲之獲取心知天氣API實(shí)時(shí)天氣數(shù)據(jù)并彈窗提醒

    Python爬蟲之獲取心知天氣API實(shí)時(shí)天氣數(shù)據(jù)并彈窗提醒

    今天我們來學(xué)習(xí)如何獲取心知天氣API實(shí)時(shí)天氣數(shù)據(jù),制作彈窗提醒,并設(shè)置成自啟動項(xiàng)目.文中有非常詳細(xì)的代碼示例及介紹,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 在PyTorch中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型的方法詳解

    在PyTorch中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型的方法詳解

    這篇文章主要為大家介紹在PyTorch如何中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型,并為您提供使用簡單的 PyTorch 接口實(shí)現(xiàn)最先進(jìn)的基于概念的模型的工具,需要的朋友可以參考下
    2023-06-06
  • 深入解析python返回函數(shù)和匿名函數(shù)

    深入解析python返回函數(shù)和匿名函數(shù)

    這篇文章主要介紹了python返回函數(shù)和匿名函數(shù)的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • OpenCV模板匹配matchTemplate的實(shí)現(xiàn)

    OpenCV模板匹配matchTemplate的實(shí)現(xiàn)

    這篇文章主要介紹了OpenCV模板匹配matchTemplate的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

晋宁县| 嘉禾县| 台中市| 蒙自县| 潼南县| 富裕县| 武山县| 阿克陶县| 新津县| 平塘县| 西乌| 宜章县| 客服| 荔波县| 巴林左旗| 双江| 易门县| 湟源县| 黄浦区| 开封市| 呼伦贝尔市| 车险| 惠安县| 巨野县| 册亨县| 伊宁县| 北辰区| 伊宁市| 东兰县| 合水县| 两当县| 崇左市| 绍兴市| 托克逊县| 西充县| 靖安县| 怀化市| 罗城| 沂水县| 河源市| 太和县|