实习学习到的:
2021.7.13 - 9.18 so hard.
一、python库相关
1. 正则表达式
wget 获取网页地址数据
python中wget方式下载使用
在使用download
将源数据的文件下载到当前的文件夹中,需要判断当前文件夹中是否存在这个文件
if os.path.exists(your_target_file_path):
os.remove(your_target_file_path)
print('your local file is removed')
2. os 系统文件操作
python os._exit() 和 sys.exit()
在自动化程序中,利用一个status
变量存储执行当前程序的执行情况,出错为False, 正常输出为True
# 这个your_script 写的很复杂,具体就是执行一个程序加的一些“包装”, 类似与装饰器,
# 对于一个函数,你还是正常传参,但是在执行代码过程中,会有日志,会对程序的执行结果返回状态的true, false
status = your_script(job,...)
if status:
sys.exit(0) # 无错误
else:
sys.exit(1) # 有错误
输出当前文件夹下,某个文件的名字:
CUR_DIR = os.path.dirname(os.path.realpath(__file__))
# os.path.realpath(__file__): 当前脚本文件的绝对路径,是../yourScript.py
# os.path.dirname:某个文件夹下的文件名,即,最后一个/ 之前的路径
# 当这个文件夹是一个空文件夹时,返回的是空
分解:、
参考:
python3中 os.path.realpath(file) 的使用
os.path.dirname用法
3. sys 系统输出
Python中sys.stdout.flush() 的作用
Python -u 和 sys.stdout.flush()
简言之,意思时让python输出台及时将我的输出打印出来,给我们看见。
从评论区来看,在windows的python查看没有多大区别,但是当你的程序运行在Linux平台上时就会不一样。(实习是在Linux上执行的)
def time_print(msg):
stime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print("{} {}".format(stime, msg))
sys.stdout.flush()
输出时间
[Python中 sys.argv\的用法简明解释
简言之,使用sys.argv得到的是一个列表,第0
个元素是当前文件,剩下后面的元素是你在命令行执行当前.py
文件传入的参数
用途:解析在命令行执行该文件传入的参数。
注:类似有一个库 argparse
有一个方法ArgumentParser
可以专门用来解析解析命令行执行当前函数的参数,只是在解析参数之前需要你给出一个关键字,比如说有我见到的解析时间参数-d
, 可以在传入参数时,就将时间参数解析我们需要的格式。
4. pandas处理表格相关
关于这个任务,我自己都不想说是多么的无趣和枯燥,填表?四个表?十几列?每个数都要从1000转变成1,000的格式,还好,我们的好朋友pandas一直都在,那么我们开始吧。
- 向数据中添加新的行
df.append(series_line, ignore_index=True) # 就酱
- 重新排列df的列的顺序
这里用到的是在输出为csv
文件时,排列列的顺序
df.columns
# ['a', 'b', 'c']
# 想变成['c', 'b', 'a']
df.to_csv(your_path, index=False, columns=['c', 'b', 'a'])
如何对Pandas DataFrame中的每个元素或者说每个数应用一个函数-applymap()函数的使用
4. 杂
Python init.py 文件使用
简言之,有了这个文件,就可以将这个文件夹下的.py
文件作为包,导入到另外一个文件中去。
在线将 CSV格式转换成Markdown Table表格的工具
二、Hadoop相关
hdoop fs -test
hdfs dfs -put <localsrc> ... <dst>
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统
三、Spark SQL相关
空值处理
PySpark na.fill在DF中未将空值替换为0
pyspark join 出现重复列的问题
填充值,和当前列的数据类型要一致,才能够填进去:
spark的df.na.fill()填充值注意的地方
四、Linux shell相关
五、time & datetime
datetime.timedelta() 找两个时间之间的时间差,
datetime.timedelta
参数可以是
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
一些代码结构上的学习:
- 是一层层套上去的
- 可以设置任务的执行列表,长度为n,当第一个执行完且没有错误(在程序执行完之后会有一个状态的返回),再执行下一个任务;
如果任务执行失败,会有一个错误信息,将这个信息写入到一个日志文件中去(在此之前需要在utils
文件中写一个log_config.py
的文件
六、Code
1、将spark中list转化为dict,其中list元素为Row变量
背景:list是df.collect()转化得来的。
# [Row(appid=u'0', game_price=u''), Row(appid=u'100257', game_price=u''), Row(appid=u'100383', game_price=u'')]
# 1. 建立map函数
# 2. 建立reduce 函数
def d2d(d1, d2):
# 在python3中可行,但是在python2中不行
return {**d1, **d2}
# or
def d2d(d1, d2):
res = {}
res.update(d1)
res.update(d2)
return res
collect_li = [Row(appid=u'0', game_price=u''), Row(appid=u'100257', game_price=u''), Row(appid=u'100383', game_price=u'')]
result = reduce(d2d, map(lambda x: x.asDict(), collect_li))
# result : {'0': '', '100257': '', '100383': ''}
2、spark查表判断用户是否是新用户,并且进行统计
具体描述