PySpark笔记(I)

爱⌒轻易说出口 提交于 2020-10-27 01:52:23

PySpark笔记(I)

Pyspark连接本地hive

// 使用hivesupporter,选取master节点名
spark = SparkSession.builder.enableHiveSupport().master('local').appName('task').getOrCreate()//本地节点,使用local(即localhost)
spark.sql('show tables').show()//

//也可以这样
conf = (SparkConf().setMaster("yarn").setAppName("task0"))
sc = SparkContext(conf=conf)
sqlContext=HiveContext(sc)
df = spark.sql("select * from table_name")

Pyspark一些基本操作

select

df.select()可以选取相应的列
df = df['xxx', 'yyy']同理

withColumn()

1)新增列

df_1 = df_1.withColumn('列名称', 内容)

2)更换列名
由于有些表是不带列名的,pyspark会自动按照_c0, _c1的顺序标注。此时可以更换列名

old_names = ['_c0', '_c1', '_c2', '_c3', '_c4']
new_names = ['x', 'y', 'z', 'a', 'b']
for old, new in zip(old_names, new_names):
    df = df.withColumnRenamed(old, new)
这样就把_c0到_c4相应的换成了x, y, z, a, b

filter()

filter十分常用。大多数筛选都会用到

v_5w = df_1.filter(df_1['x']>500) 筛选x列大于500
v_5w = df_1.filter(df_1['x']==500) 筛选x列等于500

dropDuplicates()

有时候需要去重。如果是直接去重,比如:

|x|100|5|
|x|100|5|
|y|500|3|
这个表中第一行与第二行重复,可以直接
df.dropDuplicates()
|x|100|5|
|y|500|3|

有时候,表中某列存在大量重复值,但是其他值都是distinct的。这时候可以

|id| No.1|No.2| 
|x |100  |5	  |
|y |200  |5	  |
|x |100  |5	  |
|a |400  |3	  |
|b |500  |3	  |
|c |600  |3	  |

可以按照No.2去重复:
df.dropDuplicates('No.2')
|id| No.1|No.2| 
|x |100  |5	  |
|a |400  |3	  |

take(), head(), top()

这三个命令类似,都可以提取一定数目的dataframe行。但是他们会转换为一个list,而不是保存为dataframe。

df_list = df.take(10)
print(df_list)
>> [p, y, s, p, a, r, k, 真, 牛, B]

drop()

这个命令可以删除行,列

Pyspark数据类型转换与提取

dataframe中的数据类型转换

dataframe中,有可能存在“像字典”的字符串。这时,可以将其转换成类python字典,便于分析。

LNXXXX4X4XX0XXXX|{"data": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "xxx": "LNXXXX4X4XX0XXXX"}

这样一个表, 第二列就是一个“类字典”的字符串。可以把它转换为字典:

schema = StructType([StructField("data", ArrayType(IntegerType())), 
                     StructField("xxx", StringType())])

df = df.withColumn("data", from_json(df.data, schema))
df.printSchema()

一番操作,就可以把data变为字典。

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "LNXXXX4X4XX0XXXX"]

注意,这里字典的键未能显示。

dataframe中的数据提取并建立新的一列

df_1 = df_1.withColumn('xxx', df['data'].getItem('data').getItem(5))
这样就可以建立新的一列。列标题为‘xxx’,列的内容为data列,data元素中的第五个整形数。

Pyspark表操作与数据操作

添加一个id列

pyspark dataframe不同于pandas dataframe,不自动生成(自增)id列。可以手动添加。

from pyspark.sql import Window
from pyspark.sql.functions import row_number, desc
spec = Window.partitionBy().orderBy(desc('x')) //按照x列讲叙排列
df_v = df_v.withColumn('id', row_number().over(spec))//添加id列

Pyspark数学操作

求平均

avg()

| item | velocity |
df_v = df_v.avg('velocity')
按照velocity列求平均。自动生成一个新列 avg(velocity)
| item | velocity | avg(velocity)|

也可以用上groupby()。即df.groupBy('xxx').avg('xxx')。如此可以按照groupBy中元素聚合。

dataframe保存至hive

活干完了可以把数据表保存至hive中存储。具体做法如下

from spark import HiveContext
hive_text = HiveContext(spark)
rows_data = hive_text.registerDataFrameAsTable(df, tableName = 'table') //将dataframe转换成table:registerDataFrameAsTable
hive_text.sql("create table table_test select * from table")
// 新表不存在,建立新表
hive_text.sql('insert overwrite table table_test select * from table')
// 表已经存在了,改写。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!