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
读取与写入
- 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'])
转换健值对类型之后字段读取处理方式举例
- 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)
- 写入文件
- 重新分区为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)
常用命令
- join之后铺平操作
rdd1.keyBy(lambda x: x['name']).join(rdd2.keyBy(lambda x: x['name'])).map(lambda x: dict(x[1][0], **x[1][1]))
- 去重操作(保存最后一个),并恢复到原来的形式
rdd1.keyBy(lambda x:x['name']).reduceByKey(lambda x,y: y).map(lambda x:x[1])
- 使用json形式查看
json.dumps(sc.textFile(input_path).map(json.loads).collect())
- 将rdd转为spark中的DataFrame格式
df1 = rdd1.toDF()
rdd1 = df1.map(lambda x:x.asDict())
- 将spark中的DataFrame格式转为pandas中的DataFrame,使用
toPandas()
withColumn()
#在df中新增数据列,会返回一个新的DataFrame,需要两个参数,第二个参数是对原来的列作何操作,比如原来的列整体加一,不可以从别的列进行取数。- 两种主键设置方式
rdd1.keyBy(lambda x:x['name'])
rdd1.map(lambda x:(x['name'],x))
- DataFrame去重
df.dropDuplicates()
上述实现方式可以在SQL语句中直接实现。
- spark.sql中使用自定义函数
def func1(x,y):
return x+y
func = spark.udf.register("func", func1)
- sql中groupby多个字段表示多个字段联合唯一
- sql中使用filter函数
df = spark.sql(order_sql_str)
df.filter("name='张三'")