当前位置: 首页 > news >正文

使用Shell传参解决DataPhin中PySpark不支持中文的问题

使用Shell传参解决DataPhin中PySpark不支持中文的问题

背景

笔者开发PySpark任务时【别问为神马不用Java和Scala打Jar包的方式,PySpark不需要打包所以开发效率极高,早点搞完早点下班】,遇到一个令所有SQL Boy都很头疼的问题,那就是一旦Python脚本中出现中文,该PySpark任务就报错且无法运行。所以人才们当然是异常机智,先搞个中间表把中文改成拼音,PySpark跑完了再搞个Hive On Tez任务把拼音改回中文,这种笨办法只适合于中文值的种类屈指可数的场景。

由于PySpark任务不能像Hive On Tez任务那样由DataPhin自动解析血缘和依赖,还不支持中文,所以SQL Boy们也是一度灰常嚣张,总觉得Hive On Tez任务就是最好的任务。只有遇到Tez极其严重的性能问题,才会想起来Spark的好处。

作为曾经的平台开发攻城狮,自然是不能让这股风气蔓延,不然大家都变成SQL Boy了,还和Oracle数据库开发攻城狮有啥区别。。。势必解决这个问题。

解决方式

既然Py文件中不能写中文,而我又要用中文,那么借鉴Java开发中常见的前后端Json传参的方式,我也可以Shell给Py文件动态传参,这样Py文件中就完美的规避了中文的明文,自然Py不会报错,而参数值又可以让Python调用系统方法拿到。所以可以这么尝试:

echo "START"
cat > zhiyong.py <<E0F 
# -*- coding: UTF-8-*import sys 
reload(sys)
sys.setdefaultencoding('utf-8')from pyspark.sql import SparkSession 
spark = SparkSession \.builder	\.appName("project_week_his_incre_daily_prod")	\.config("hive.exec.dynamic.partition","true")	\.config("hive.exec.dynamic.partition.mode","nonstrict")	\.getOrCreate()str_bizdate=sys.argv[1]str_param1=sys.argv[4].strip()
str_param2=sys.argv[5].strip()
str_param3=sys.argv[6].strip()sq11="""select '""" + str_param3 + """' as str_param3"""
spark.sql(sql1).show()EOFhive_db1="hive_db_name1"
hive_db2="hive_db_name2"
STR1="中文1"
STR2="中文2"
STR3="中文3"spark-submit --master yarn --deploy-modeclient --driver-memory 4G --executor-memory 4G --executor-cores 1 --conf spark.dynamicAllocation.enabled=true --conf spark.dynamicAllocation.minExecutors=10 --conf spark.dynamicAllocation.maxExecutors=50 --confspark.memory.fraction=0.95 --confspark.shuffle.service.enabled=true --conf spark.ui.port=4180 --conf spark.port.maxRetries=128--conf spark.rpc.timeout=600s --conf spark.debug.maxToStringFields=4096 --conf spark.sql.crossJoin.enabled=true --conf spark.sgl.broadcastTimeout=600s --conf spark.sql.autoBroadcastJoinThreshold=-1 zhiyong.py ${bizdate} hive_db1 hive_db2 $STR1 $STR2 $STR3

经过验证,果然可以show出传入的中文参数!!!

原理

这个cat重定向的py文件不支持直接写中文,大概率是Encoder的问题。但是Shell本身可以正常写中文参数,说明Linux Node的中文语言包和character set正常,那么只需要在外层的Shell预先构建变量,再通过spark-submit提交这个py文件时传入这些内容为中文的String参数,即可在Python脚本中动态获取到变量的值,再去拼接SQL字符串给Spark的算子使用。Python文件中依旧不能有明文的中文。

SQL和拼接的其它中文字符串的注释可以用#注释掉,写在Shell的头上。

进一步排查

这么做,给SQL Boy们使用已经足够了,毕竟他们之前只搞过Oracle数据库开发当然也就只会SQL,除此之外没啥会的东西了。

但是从平台开发的视角,其实还是可以做进一步的分析。笔者的PyCharm一般是用Python3.7,这么搞PySpark任务即便有中文也跑的很欢快。出现这种情况,首先发现租来的阿里云DataPhin还是老掉牙的Python2.6,那么:

echo "START"
cat > zhiyong.py <<E0F 
# -*- coding: UTF-8-*

给Py文件的头上+个这玩意儿,期望当然是可以识别中文。

但是本地、扔服务器都可以跑有中文参数/SQL的PySpark任务,就是扔DataPhin跑不起来。。。

于是手动cat生成的py文件,发现了惊天大秘密:DataPhin解析有问题,把#的这一行当Linux的注释给filter了。。。

属实无语的操作。。。

所以更改脚本的解析方式,或者把基础环境的python升级到3.7都是个比shell传参更好的主意。平台的事情,就不是SQL Boy能解决的了。

转载请注明出处:https://lizhiyong.blog.csdn.net/article/details/129699142

在这里插入图片描述

相关文章:

使用Shell传参解决DataPhin中PySpark不支持中文的问题

使用Shell传参解决DataPhin中PySpark不支持中文的问题 背景 笔者开发PySpark任务时【别问为神马不用Java和Scala打Jar包的方式&#xff0c;PySpark不需要打包所以开发效率极高&#xff0c;早点搞完早点下班】&#xff0c;遇到一个令所有SQL Boy都很头疼的问题&#xff0c;那就…...

【CDH】cloudera manger 如何开启Debug 日志调试模式

前言 在安装 Cloudera Manger 时&#xff0c;遇到报错&#xff0c;需要开启Debug 日志级别来排查下问题原因。这里记录下 CM 如何开启 Debug 级别。 方法一&#xff1a;为整个服务启动DEBUG 如果 CM 无法启动&#xff0c;则可以为整个服务器启用 DEBUG 或 TRACE。 警告&…...

SQL Server 用户授权与回收

创建xxbbbb账号&#xff0c;账号可以在Company_report20221019.dbo.qfacccmprf表中进行select、 insert,update,delete --创建登录账号 create login xxbbbb with password12345#---创建用户 use Company_report20221019 create user xxbbbb for login xxbbbb---将qfacccmprf表…...

电脑出现乱码的原因以及解决方法

在日常使用电脑的过程中&#xff0c;经常会遇到电脑出现乱码&#xff0c;那么为什么会出现乱码呢&#xff1f;出现乱码又该怎么解决呢&#xff1f;下面我们一起来了解一下。 出现乱码的原因 系统乱码&#xff1a;主要是Windows中显示乱码&#xff0c;比如菜单、桌面、启动界面…...

网络工程师笔记

第一天&#xff1a; 编码就是转化为数字信号&#xff1b;调制就是转化为模拟信号&#xff1b; 调制&#xff1a; 1、基带调制&#xff08;不改变频率&#xff0c;只改变波形&#xff09; 2、带通调制&#xff08;迁移到较高的频段进行传输&#xff09; &#xff08;1&…...

linux用户添加用户组与目录切换用户组的操作记录

linux用户添加到多个组 usermod -G groupname username (这种会把用户从其他组中去掉&#xff0c;只属于该组) 如&#xff1a;usermod -G git git (git只属于git组) usermod -a -G groupname username (把用户添加到这个组&#xff0c;之前所属组不影响) 如&#xff1a;usermod…...

在CentOS 7上使用二进制文件安装单节点Kubernetes的详细步骤:

确保您的系统已经安装了Docker和etcd。如果没有&#xff0c;请按照以下命令安装它们&#xff1a; yum install docker etcd 启动Docker服务并将其设置为开机自启&#xff1a; systemctl start docker systemctl enable docker 下载所需的Kubernetes二进制文件。您可以从以下网…...

iCollections for mac 8.0.6.80608 保持Mac桌面的整洁

应用介绍 iCollections允许您在桌面上创建区域&#xff0c;以便您可以排序和排列图标。这可以帮助您将相关项目保持在一起&#xff0c;以便文件&#xff08;图片&#xff0c;文档&#xff0c;屏幕截图&#xff0c;应用程序等&#xff09;井井有条且易于查找。 小麦测试可以按照…...

学习HM微博项目第8天

步骤&#xff1a;发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和发送微博按钮 -> 发微博04-显示工具条 -> 发微博05-封装工具条和相册 -> 发微博06-发送微博 发微博01-导航栏内容 APP的演示操作&#xff1a; 从APP的演示操作中可…...

十五、存储过程与函数

一、存储过程概述 1、简介 含义&#xff1a;存储过程的英文是 Stored Procedure 。它的思想很简单&#xff0c;就是一组经过 预先编译 的 SQL 语句的封装 执行过程&#xff1a;存储过程预先存储在 MySQL 服务器上&#xff0c;需要执行的时候&#xff0c;客户端只需要向服务器…...

php实现助记词转TRX,ETH 私钥和钱包地址

TRX助记词转地址网上都是Java&#xff0c;js或其他语言开发的示例&#xff0c;一个简单的功能需要依赖其他环境来实现表示不能忍&#xff0c;毕竟php是世界上最好的语言。【狗头】 一、知识准备 要实现助记词转TRX私钥和地址&#xff0c;先需要知道助记词和私钥钱包地址之间的…...

浅析可观测系统中sdk的不同引入方式的利与弊

文章前提是不考虑sw的方式引入&#xff0c;同时不考虑在nginx等自动注入js脚本的方式&#xff0c;那么基本就是两种大的形式&#xff1a;cdn引入和本地引入其中cdn引入有两种&#xff1a;cdn同步cdn异步本地引入有两种&#xff1a;npm本地js文件参考知识提前先补充一张图片正文…...

Google Earth导入经纬高(txt文件)

目录 一、提取GNSS数据生成txt文本文件 二、Google Earth导入txt文件 1、启动Google Earth 2、打开vig_result.txt...

Unity客户端开发工程师的进阶之路

UWA技能成长系统是UWA根据学员的职业发展目标&#xff0c;提供技能学习的推荐路径&#xff0c;再将所需学习内容按难易等多维度&#xff0c;设计分成多个学习阶段&#xff0c;可以循序渐进地进行学习。 进入技能成长体系&#xff0c;目标选择高级客户端开发工程师&#xff08;U…...

2023年全国最新高校辅导员精选真题及答案34

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 72.心理发展的特点是&#xff08;&#xff09;。 A.方向性与不可逆性 B.连续性与阶段性…...

chatGPT身份指令

充当 Linux 终端 我想让你充当 Linux 终端。我将输入命令&#xff0c;您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出&#xff0c;而不是其他任何内容。不要写解释。除非我指示您这样做&#xff0c;否则不要键入命令。当我需要用英语告诉你一些事情时&…...

基于springboot实现私人健身与教练预约管理系统【源码+论文】分享

基于springboot实现私人健身与教练预约管理系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea M…...

网络技术领域术语大全,含中英文及缩写,强烈建议收藏!

你好&#xff0c;这里是网络技术联盟站。 今天给大家分享的是网络技术领域相关的术语大全&#xff0c;在文末&#xff0c;我已经将本文整理成一个pdf文档了&#xff0c;大家可以下载到本地以便查阅。 自主访问控(DAC:Discretionary Access Control) 自主访问控制(DAC)是一个…...

C++源码剖析——vector和array

前言&#xff1a;之前看过侯老师的《STL源码剖析》但是那已经是多年以前的&#xff0c;现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。   摘要&#xff1a;本文描述了llvm中libcxx的std::vector的实现。   关键字&…...

学习linux编程(一)

本文导航一. Linux基础知识杂记0. terminal操作快捷键等1. 为什么vfork的子进程里用return&#xff0c;整个程序会挂掉&#xff0c;而且exit不会(zz)2. 进程内存管理详解3. 关于堆和自由存储区概念的区别4. cache和buffer的区别5. C实现线程池6. 静态函数和虚函数的区别7. C里是…...

pt-query-digest_详细使用方法

pt-query-digest_详细使用方法1. pt介绍1.1. 说明1.2. 安装2 语法选项2.1 所有参数2.2 常见参数2.3 事件和属性2.4 分组2.5 过滤2.6 排序2.7 输出选项2.8 DSN(数据源)选项3. 慢日志3.1 事件属性3.2 分析报告3.2.1 第一部分&#xff1a;总体概况说明3.2.2 第二部分&#xff1a;查…...

基于MATLAB编程的萤火虫FA优化BP神经网络的回归分析

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络激活函数及公式 SVM应用实例,基于fa-svm分类预测 代码 结果分析 展望 BP神经网络的原理 BP神经网络的定义 人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过…...

leetcode 消失的数字(面试题)

题目 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 注意&#xff1a;本题相对书上原题稍作改动 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 示例 2&#xff1a; 输入&…...

Spring入门篇6 --- AOP

目录1.核心概念AOP(Aspect Oriented Programming)面向切面编程&#xff1a;一种编程范式&#xff0c;指导开发者如何组织程序结构作用&#xff1a;在不惊动原始设计的基础上为其进行功能增强。连接点(JoinPoint)&#xff1a;程序执行过程中的任意位置切入点(PointCut)&#xff…...

linux 配置java环境

1、上传jdk包到/usr/local/java目录下 2、解压jdk的tar包 tar -zxvf jdk-8u291-linux-x64.tar.gz 3、添加配置&#xff08;环境变量&#xff09; 注意&#xff1a;JAVA_HOME值为实际jdk路径 打开配置文件 vi /etc/profile 最下面添加: #set java environment JAVA_HOME/usr/…...

分布式事务基础入门

分布式事务基础入门 什么是分布式事务 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现的&#xff0c;因此叫数据库事务&#xff0c;由于应用主要靠关系数据库来控制事务&#xff0…...

白盒测试究竟怎么做

大家好&#xff0c;我是洋子 在进行日常测试的时候&#xff0c;我们大部分时间花在手动的功能测试上&#xff0c;功能测试又可称为手工测试&#xff0c;官方一点的学名叫黑盒测试&#xff0c;当然作为测试工程师&#xff0c;我们一般俗称点点点 黑盒测试是一种软件测试方法&am…...

EEG微状态的功能意义

导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构&#xff0c;这些结构能够最佳地解释自发EEG记录中随时间变化的差异。这四种结构被称为EEG微状态A、B、C和D类&#xff0c;分别与言语/语音、视觉、主观感受-自主加工和注意力重定…...

Python3 - Flask+swift实现单点登录

基于 Flask 和 Redis 实现单设备登录的服务端代码和客户端swift、oc代码&#xff1a; Python flask 实现服务端 from flask import Flask, jsonify, request from redis import Redisapp Flask(__name__) redis_db Redis()# 用户登录接口&#xff0c;验证用户名和密码&#…...

HTML URL

文章目录HTML URLURL - 统一资源定位器常见的 URL SchemeURL 字符编码URL 编码实例HTML URL URL 是一个网页地址。 URL可以由字母组成&#xff0c;如"csdn.net"&#xff0c;或互联网协议&#xff08;IP&#xff09;地址&#xff1a; 192.168.100.1。大多数人进入网站…...