数据开发【配置文件】和【传参】规范

别再手动执行SQL了!用DolphinScheduler的Shell节点调用.sql文件,实现自动化调度(附传参实战) 本文详细介绍了如何利用DolphinScheduler的Shell节点实现SQL文件的自动化调度,包括环境准备、SQL文件管理、参数传递技巧及生产环境最佳实践。通过海豚调度系统,开发者可以高效调用.sql文件并实现参数化,大幅提升数据开发和运维效率。 阅读详情

概述

  • 配置文件
    概念:一种计算机文件,可给 计算机程序 配置 参数和初始设置
    场景:软件开发时,生产环境数据库账号密码 应写到配置文件,不应明文写到代码中
常见的配置文件后缀示例
.propertiesKafka的server.properties
用于Java的日志配置文件log4j.properties
.xmlHadoop的core-site.xml
.iniMySQL的my.ini
.cnfMySQL的my.cnf
.confRedis的redis.conf
.ymlElasticSearch的elasticsearch.yml
.bashrc每个运行Bash用户的个性化设置
.json、.config.js前端常用

properties文件是Java中的一种配置文件,文件后缀为.properties,内容格式为key=value,用#注释

  • 传参
    本文的传参是指:通过 命令行 来给程序传递参数
    传参方式有:位置传参、键值对传参…
    当参数多于1个时,建议使用 键值对传参
    场景:日期、并行度

规范

  • 为了 数据开发 的 代码规范:
    配置格式 统一使用 properties
    传参方式 统一使用 键值对传参

  • 生产环境的配置文件 统一 存放到HDFS
    测试配置 写到 本地配置文件
    优先级(大者覆盖小者):
    临 时 配 置 > 生 产 配 置 临时配置 > 生产配置 临时配置>生产配置
    命 令 行 参 数 > H D F S 配 置 文 件 命令行参数 > HDFS配置文件 命令行参数>HDFS配置文件

  • 配置文件命名
    【建议】全小写
    【强制】下划线分隔单词
    示例:sqoop_mysql2hive.properties

  • 配置文件路径(两种方式):
    业务/子业务/存储媒介.properties
    部门/小组/岗位.properties

业务子业务媒介配置文件路径参数
金融股票MySQL/config/finance/stock/mysql.propertieshost
user
password
database
数据中台HBase/config/data_center/hbase.propertieszkUrl
数据中台Kafka/config/data_center/kafka.propertiesbootstrap-server
部门小组员工ID配置文件路径参数
IT大数据实时计算/config/it/big_data/rt.propertiesqueue_name
IT大数据数据仓库/config/it/big_data/dw.propertiesqueue_name
IT算法自然语言处理/config/it/ai/nlp.propertiesqueue_name

代码模板

Python2

#!/usr/bin/python2
# coding:utf-8
"""
获取参数的工具类
    获取参数的方式
        1、properties配置文件
        2、命令行传参
    参数格式
        key=value
    命令行传参示例:
        python2 a.py ymd=2021-12-31 sql='带空格的value可用单引号包裹'
    参数优先级(大者覆盖小者)
        命令行参数 > HDFS配置文件 > 本地配置文件
        临时配置 > 生产配置 > 测试配置
详细链接:
    https://yellow520.blog.youkuaiyun.com/article/details/122088401
"""


class ParameterUtil:
    def __init__(self, hdfs_file='', local_file=''):
        self.dt = dict()
        if local_file:
            self._read_local_file(local_file)
        if hdfs_file:
            self._cat_hdfs(hdfs_file)
        self._get_cmd_parameters()

    def _read_local_file(self, file_path):
        """从本地读取配置文件,并获取参数"""
        try:
            with open(file_path) as f:
                self._properties2dict(f.read())
        except IOError:
            print('本地配置文件不存在')

    def _cat_hdfs(self, file_path):
        """从HDFS读取配置文件,并获取参数"""
        from subprocess import check_output, CalledProcessError
        cmd = 'hadoop fs -cat ' + file_path
        try:
            self._properties2dict(check_output(cmd, shell=True))
        except CalledProcessError:
            print('HDFS配置文件不存在')

    def _properties2dict(self, properties):
        """properties文件内容解析"""
        for r in properties.strip().split('\n'):
            if (not r.startswith('#')) and (r.find('=') > 0):
                k, v = r.split('=', 1)
                self.dt[k.strip()] = v.strip()

    def _get_cmd_parameters(self):
        """从命令行获取参数"""
        from sys import argv
        for a in argv[1:]:
            k, v = a.split('=', 1)
            self.dt[k.strip()] = v.strip()

    def get(self, key, default=None):
        """获取参数值"""
        return self.dt.get(key, default)

Python3

from time import time, strftime
from datetime import date, timedelta
import os
import platform
from subprocess import check_output, CalledProcessError


class Timer:
    def __init__(self):
        self.t = time()  # 起始秒数

    def __del__(self):
        if self.__str__():
            print('结束时间:%s' % self.now)
            print('运行时间:%s' % self)

    def __str__(self):
        t = self.seconds
        if t < 1:
            return ''
        elif t < 60:
            return '%.2fs' % t
        elif t < 3600:
            return '%.2fmin' % (t / 60)
        else:
            return '%.2fh' % (t / 3600)

    @property
    def seconds(self) -> float:
        """程序运行秒数"""
        return time() - self.t

    @property
    def now(self) -> str:
        """当前时间字符串"""
        return strftime('%Y-%m-%d %H:%M:%S')

    @property
    def today(self) -> date:
        return date.today()

    @property
    def yesterday(self) -> str:
        yesterday = self.today - timedelta(days=1)
        return yesterday.strftime('%Y-%m-%d')

    @property
    def this_year(self) -> int:
        return self.today.year

    @property
    def last_year(self) -> int:
        return self.this_year - 1

    @property
    def this_month(self) -> str:
        """本月,格式YYYY-MM"""
        return '%04d-%02d' % (self.this_year, self.today.month)

    @property
    def last_month(self) -> str:
        """上个月,格式YYYY-MM"""
        last_day_of_last_month = self.today - timedelta(days=self.today.day)  # 上个月的最后一天
        last_month = last_day_of_last_month.month  # 上个月
        year = last_day_of_last_month.year  # 上个月所在的年份
        ym = '%04d-%02d' % (year, last_month)  # 上个月的完整格式:YYYY-MM
        return ym


class Executor(Timer):
    def debug(self, text):
        """仅在Windows打印"""
        if platform.system() == 'Windows':
            print('[DEBUG {}] {}'.format(self.now, text))

    @staticmethod
    def execute(cmd):
        """执行Linux命令"""
        os.system(cmd)

    @staticmethod
    def evaluate(cmd):
        """执行Linux命令并获取返回值"""
        return check_output(cmd, shell=True)


class ParameterUtil(Executor):
    """https://yellow520.blog.youkuaiyun.com/article/details/122088401"""

    def __init__(self, *hdfs_files):
        super().__init__()
        self.dt = dict()
        for hdfs_file in hdfs_files:
            self._cat_hdfs(hdfs_file)
        self._get_cmd_parameters()

    def _cat_hdfs(self, file_path):
        """从HDFS读取配置文件,并获取参数"""
        cmd = 'hadoop fs -cat ' + file_path
        try:
            self._properties2dict(self.evaluate(cmd))
        except CalledProcessError:
            print('HDFS配置文件不存在')

    def read_local_file(self, file_path):
        """从本地读取配置文件,并获取参数"""
        try:
            with open(file_path) as f:
                self._properties2dict(f.read())
        except IOError:
            print('本地配置文件不存在')

    def _properties2dict(self, properties):
        """properties文件内容解析"""
        for r in properties.strip().split('\n'):
            if (not r.startswith('#')) and (r.find('=') > 0):
                k, v = r.split('=', 1)
                self.dt[k.strip()] = v.strip()

    def _get_cmd_parameters(self):
        """从命令行获取参数"""
        from sys import argv
        for a in argv[1:]:
            k, v = a.split('=', 1)
            self.dt[k.strip()] = v.strip()

    def get(self, key, default=None):
        """获取参数值"""
        return self.dt.get(key, default)

    @property
    def ymd(self) -> str:
        """获取日期,格式YYYY-MM-DD,默认昨天"""
        return self.get('ymd', self.yesterday)

    @property
    def ym(self) -> str:
        """获取日期,格式YYYY-MM,默认上个月"""
        return self.get('ym', self.last_month)

Java(待完善)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

/**
 * ParameterUtil parameters = new ParameterUtil(args, "mysql.properties", "kafka.properties");
 * String ymd = parameters.get("ymd");
 */
public class ParameterUtil {
    Properties p = new Properties();

    public ParameterUtil(String[] args, String... hdfsPaths) {
        //获取HDFS上的配置文件
        for (String hdfsPath : hdfsPaths) {
            catHdfs(hdfsPath);
        }
        //命令行传参
        for (String arg : args) {
            String[] kv = arg.split("=", 1);
            p.setProperty(kv[0].trim(), kv[1].trim());
        }
    }

    /** 读取HDFS上的配置文件 */
    private void catHdfs(String hdfsPath) {
        try {
            Process process = Runtime.getRuntime().exec("hadoop fs cat " + hdfsPath);
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = reader.readLine()) != null) {
                if (!line.startsWith("#") && line.contains("=")) {
                    String[] kv = line.split("=", 1);
                    p.setProperty(kv[0].trim(), kv[1].trim());
                }
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /** 读取本地properties配置文件 */
    public void readLocalFile(String localPath) {
        try {
            p.load(new FileInputStream(localPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String get(String key) {
        return p.getProperty(key);
    }

    public String get(String key, String defaultValue) {
        return p.getProperty(key, defaultValue);
    }
}
代码规范、命名、配置文件、Code+Review建议各类规范大全 java、svn、mysql、dubbr、venus-common-monitor、venus-restful、公共码、日志、代码规范、命名、配置文件、Code+Review建议、postman等等等等;各类规范文档 立即下载

相关推荐

规范代码配置文件.doc

规范代码配置文件.doc规范代码配置文件.doc规范代码配置文件.doc

Java的参数传递

Spring和Spring Boot都是Java领域中非常流行的开发框架,用于简化企业级应用程序的开发。确保你已经在Spring容器中配置了要注入的Bean对象。这可以通过在XML配置文件或Java配置类中定义Bean来完成。在目标类中使用@Autowired注解来标记需要注入的属性或构造函数参数。@Component // 声明这是一个Spring托管的Bean@Autowired // 使用@Autowired注解进行自动注入// 使用注入的repository对象执行操作。

m0_70054514的博客 1222

wsl2上运行带有Isaac Gym的程序报错: GPU Pipeline: disabled

显示GPU Pipeline:disabled,查找相关文档发现是WSL2目前不支持Isaac Gym,时,想要在wsl2上运行,最后报错如下。

2303_78660611的博客 960

java向配置文件中传参

有时候在写配置文件时,可能需要我们进行动态的传参,可以采用下面的方法: 配置文件,{0}是传的第一参数,{1}是传的第二个参数 jdbc.url=jdbc:mysql://{0}:3306/{1} // 这里谢了加载配置文件的两种方法 import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; impo...

Lu_Xiao_Yue的博客 1415

VCS2018在Ubuntu20 18安装步骤

之前在Ubuntu20上下VCS,花了好几天时间,本来想写博客避免以后重复劳动。但由于各种原因拖了一两个月,这次由于疫情原因,期末考试推迟,所以就再次在Ubuntu18上下了VCS,顺便写博客记录。 以下VCS2018安装方法适用于 Ubuntu20、Ubuntu18,亲测可用。其他Linux发行版没试过,但应该步骤差不多。 文章目录安装包安装步骤1、建立安装路径,更改权限2、运行安装器进行安装3、生成License文件4、设置环境变量5、验证License6、启动lmgrd验证软件是否安装成功dvever

s-stone的博客 3万+

常微分方程 (ODE) 和 随机微分方程 (SDE)

常微分方程(Ordinary Differential Equations, ODE)和随机微分方程(Stochastic Differential Equations, SDE)是数学中描述系统动态行为的重要工具。它们有一些相似之处,但在处理随机性方面存在显著差异。

weixin_39699362的博客 4384

Spring Boot 核心配置文件,yml 语法规范、多环境配置、配置文件加载顺序,EnvironmentAware 读取 yml 配置

目录 需求分析 多 profile 文件形式 yml 文档块形式 需求分析 Profile 是 Spring 对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境 项目开发时有开发环境、测试环境、部署环境等,可以通过 profile 配置切换 多 profile 文件形式 格式:application-{profile}.properties/yml,如:ap...

蚩尤后裔-汪茂雄 1万+

从CCD数据上报看wxHOOK的封号风险与规避

本文深入分析了微信CCD数据上报机制对wxHOOK的检测逻辑与封号风险,揭示了调试器路径暴露、非白名单DLL加载和内存校验失败等关键风险点。通过实战案例和规避方案,帮助开发者理解如何安全使用wxHOOK技术,避免封号风险,包括内存镜像欺骗、内核级隐蔽和硬件辅助方案等高级技巧。

weixin_27875131的博客 634

配置文件规范

文章目录关于配置文件说明默认配置文件名称properties语法说明YML语法说明 关于配置文件说明 默认配置文件名称 springboot项目 默认配置文件的名称 application.properties 名称一般固定,不会随意更改. properties语法说明 语法说明: 数据结构 key=value value中前后不要有空格 properties文件 程序默认读取采用ISO-8859-1编码结构 中文必定乱码. pro文件中key的名称不能复用. YML语法说明 语法说明: 数据结构 k

Javaciyuwolilian的博客 1008

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

从零到一:华为iMaster NCE-Campus部署中的Euler OS与FusionInsight深度解析

本文深入解析华为iMaster NCE-Campus部署中Euler OS与FusionInsight的关键技术要点,包括RAID配置、网络绑定技术、安装避坑指南及性能调优方案。通过实战经验和详细配置示例,帮助工程师提升部署效率与系统稳定性,确保华为企业级解决方案的高效运行。

f6g7h8i9j的博客 550

配置传参的写法

static config (options) { Object.keys(options).forEach(key => { Config[key] = options[key]; }); }

duancsdn的博客 197

医学图像的对抗攻击:模型安全性与鲁棒性分析

医学图像的对抗攻击:模型安全性与鲁棒性分析 ,人工智能,计算机视觉,大模型,AI,本文围绕医学图像的对抗攻击展开,分析了其对AI模型的威胁。介绍了对抗样本定义、攻击原理,以及FGSM、BIM、PGD等常见攻击方法,还给出了相关代码示例。阐述了攻击对模型诊断准确性和可信度的影响,提出对抗训练、输入预处理、模型集成等提升模型安全性与鲁棒性的方法,探讨了评估指标、数据集和流程,分析了实际应用中的挑战与应对策略,最后展望了未来发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

数据开发 的 代码规范 以及 代码评审脚本

代码评审 Python编码规范 SQL编码规范 子查询用WITH AS,每个子查询都要有中文注释 代码审核 正则表达式 注释占比 注释占比 代码审核脚本Python3 编程规范 代码规范 代码扫描 代码审核

ArYe 1968

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【javaWeb &第九篇】功能接口开发流程以及常用注解

简单开发中的常用注解

weixin_62513677的博客 1198

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【SpringBoot】临时属性,配置文件分类,自定义配置文件,多环境开发,日志(日志文件)

之前咱们做配置使用的配置文件都是application.yml,其实这个文件也是可以改名字的,这样方便维护。比如我2020年4月1日搞活动,走了一组配置,2020年5月1日活动取消,恢复原始配置,这个时候只需要重新更换一下配置文件就可以了。但是你总不能在原始配置文件上修改吧,不然搞完活动以后,活动的配置就留不下来了,不利于维护。注意:SpringBoot默认只识别名称为application的配置文件方式一:使用临时属性设置配置文件名,注意仅仅是名称,不要带扩展名。

qq_60969145的博客 787

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java解析属性配置文件并给占位符传参

//注册功能 public void register(User user){ //补齐数据 user.setUid(CommonUtils.uuid()); user.setStatus(false); user.setActivationCode(CommonUtils.uuid() + CommonUtils.uuid()); try { userDao.save(user);

学习达人的日记本 2663

JAVA--读取配置文件中的参数

配置文件(db.properties)位于src/main/resources/resource中且中内容如下: jdbc.username=sa jdbc.password=123456 获取配置文件中的参数值有方法如下: 方法1: public class ReadConfigurationClass { public static Map readConfigurati...

小小黑丶的博客 6584

java 配置文件参数_从Java的配置文件中读取配置参数的最佳方法是什么?

I am thinking it will impact performance.我怀疑这是真的。假设应用程序在启动时只读取配置文件一次,则读取文件所需的时间可能与应用程序的整体性能无关。实际上,应用程序运行的时间越长,启动时间越短。只有在具体证据(即测量)来表示性能是重大问题时,才能优化应用程序性能,并且您正在寻求优化的代码是真正的瓶颈。Can I use separate final clas...

weixin_36313588的博客 1160

关于java开发常用的配置文件,logback,mybatis

代码】关于java开发常用的logback,mapper,mybatis等配置文件。

qq_51147454的博客 740

配置文件规则

服务端常用数据样式描述 1: 取工作区的第一列作为内容输出 list {list, Sheets} 例如: fun: {list, cb_fun, handle, {list, [“主线任务”, “支线任务”]}} data: list() -> [10000, 10001]. 2: 取工作区的所有行指定列作为内容输出 {tuple_list, ValFields} {tuple_list, Sheets, ValFields} {tuple_list, Sheets, ValFields, Opt

weixin_45062852的博客 315

项目中用户的资源文件存放的规范配置文件

读取配置文件的: package com.xuan.util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 从config.propert

hins 1288

Linkerd Service Mesh 服务配置文件规范

服务配置文件 为 Linkerd 提供有关服务的附加信息。 以下是可以使用服务配置文件完成的所有操作的参考。 系列 中文手册(https://linkerd.hacker-linner.com) Spec(规范) 服务配置文件规范必须包含以下顶级字段: field value routes route 对象的列表 retryBudget 定义此服务的最大重试率的 retry ...

o__cc的博客 317

yaml配置文件的语法规范

1、基本语法 k:(空格)v:表示一对键值对(空格必须有); 以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的 server: port: 8081 path: /hello 属性和值也是大小写敏感; 2、值的写法 字面量:普通的值(数字,字符串,布尔) ​ k: v:字面直接来写; ​ 字符串默认不用加上单引号或者双引号; ​ " ":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思 ​ name: “zhangsan \n lisi

诗水人间 12万+
上一篇: 数据开发 的 代码规范 以及 代码评审脚本
下一篇: Canal或maxwell实时采集MySQL数据到Kafka
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值