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')
// 表已经存在了,改写。
来源:oschina
链接:https://my.oschina.net/u/4265623/blog/4389011