pyspark使用

pyspark背景

  • saprk本身是Scala语言编写的,使用pyspark可以使用python语言处理RDD。
  • RDD代表Resilient Distributed Dataset,它们是在多个节点上运行和操作以在集群上进行并行处理的元素。RDD是不可变元素,这意味着一旦创建了RDD,就无法对其进行更改。RDD也具有容错能力,因此在发生任何故障时,它们会自动恢复。您可以对这些RDD应用多个操作来完成某项任务。
  • RDD执行包括Transformation(不立即执行)和Action(立即执行)两种计算方式。

常用函数

1.RDD操作,立即执行
在这里插入图片描述
2.不立即执行
在这里插入图片描述
3.Pair RDD操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

头文件激活等

在这里插入图片描述

头文件

spark = SparkSession.builder.appName('tmp').config('')...
sc = spark.sparkContext

读取与写入

  1. sql形式读取
order_sql_str = """
select
    name
    ,age
from
    custome_order
where
    concat(year, month, day) between {0} and {1}
""".strip()
begin_str, end_str = '20210826', '20210826'
df_order = spark.sql(order_sql_str.format(begin_str, end_str))
  • 得到的是df类型
  • df_order.rdd转换为RDD类型(字段调取方式为字典型和pd型)
  • df_order.rdd.keyBy(lambda x:x.name)转换为RDD类型之后取值用df类型方式
  • df_order.rdd.map(lambda x: x.asDict())转换为RDD类型之后转为健值对类型
  • df_order.rdd.map(lambda x: x.asDict()).keyBy(lambda x:x['name']) 转换健值对类型之后字段读取处理方式举例
  1. sc.textFile形式读取
order_rdd = sc.textFile('/home/custome')
  • 读入的形式是RDD类型,后续可以转json,可以map函数处理,可以take一条看内容加以灵活处理,例如:
order_rdd.map(json.loads)
def _format(line):
	return {'name':line['name'],
	'age':line['age']}
order_rdd.map(_format)
  1. 写入文件
  • 重新分区为1part写入output_path
rdd1.map(json.dumps).repartition(1).saveAsTextFile(outout_path)
  • 将list类型的arr转换为rdd类型写入output_path
sc.parallelize([arr]).map(json.dumps).repartition(1).saveAsTextFile(outout_path)
  • parquet形式写入与读取
df.repartition(100).write.parquet(path=output,mode='overwrite')
df = spark.read.parquet(output)

常用命令

  1. join之后铺平操作
rdd1.keyBy(lambda x: x['name']).join(rdd2.keyBy(lambda x: x['name'])).map(lambda x: dict(x[1][0], **x[1][1]))
  1. 去重操作(保存最后一个),并恢复到原来的形式
rdd1.keyBy(lambda x:x['name']).reduceByKey(lambda x,y: y).map(lambda x:x[1])
  1. 使用json形式查看
json.dumps(sc.textFile(input_path).map(json.loads).collect())
  1. 将rdd转为spark中的DataFrame格式
df1 = rdd1.toDF()
rdd1 = df1.map(lambda x:x.asDict())
  1. 将spark中的DataFrame格式转为pandas中的DataFrame,使用toPandas()
  2. withColumn()#在df中新增数据列,会返回一个新的DataFrame,需要两个参数,第二个参数是对原来的列作何操作,比如原来的列整体加一,不可以从别的列进行取数。
  3. 两种主键设置方式
rdd1.keyBy(lambda x:x['name'])
rdd1.map(lambda x:(x['name'],x))
  1. DataFrame去重
df.dropDuplicates()

上述实现方式可以在SQL语句中直接实现。

  1. spark.sql中使用自定义函数
def func1(x,y):
	return x+y
func = spark.udf.register("func", func1)
  1. sql中groupby多个字段表示多个字段联合唯一
  2. sql中使用filter函数
df = spark.sql(order_sql_str)
df.filter("name='张三'")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值