第一次实习中学习到的(python,数据处理,Spark,Hadoop,Linux,time related

实习学习到的:

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对输出列的顺序重排

pandas 对某一列指定小数位数保留

如何对Pandas DataFrame中的每个元素或者说每个数应用一个函数-applymap()函数的使用

Pandas教程 | 超好用的Groupby用法详解

4. 杂

Python init.py 文件使用
简言之,有了这个文件,就可以将这个文件夹下的.py文件作为包,导入到另外一个文件中去。

关于python:如何用逗号作为千位分隔符来输出数字?

在线将 CSV格式转换成Markdown Table表格的工具

tableConvert

python如何把两个字典像这样相加?

二、Hadoop相关

hdoop fs -test
hdfs dfs -put <localsrc> ... <dst>
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统

三、Spark SQL相关

空值处理
PySpark na.fill在DF中未将空值替换为0
pyspark join 出现重复列的问题
填充值,和当前列的数据类型要一致,才能够填进去:
spark的df.na.fill()填充值注意的地方

Spark中广播变量(broadcast)使用

四、Linux shell相关

shell中echo命令详解

linux复制一行或几行数据到另一个文本

【原创】Linux基础之linux常用命令之文本替换

linux下vim 选择文本,删除,复制,粘贴

五、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查表判断用户是否是新用户,并且进行统计
具体描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值