文章目录
-
- 为什么用
- 怎么用
-
- 初始化类 class pyspark.sql.SparkSession 类
- 函数说明
- 利用DataFrame API查询
- 利用sql查询
- DataFrame函数说明
-
- 创建DataFrame
- agecol=people.age 选择其中的列
- agg(*exps)
- alias(alias)
- approxQuantile(col,pro probabilities, relativeError)
- cache()
- checkpoint([eager])
- coalesce(numPartitions)
- colRegex(colName)
- collect()
- corr(col1, col2[, method])
- count()
- cov(col1, col2)
- createGlobalTempView(name)
- createOrReplaceGlobalTempView(name)
- createOrReplaceTempView(name)
- createTempView(name)
- crossJoin(other)
- crosstab(col1, col2)
- cube(*cols)
- describe(*cols)
- distinct()
- drop(*cols)
- dropDuplicates([subset])
- drop_duplicates([subset])
- dropna([how, thresh, subset])
- exceptAll(other)
- explain([extended, mode])
- fillna(value[, subset])
- filter(condition)
- first()
- foreach(f)
- foreachPartition(f)
- freqItems(cols[, support])
- groupBy(*cols)=group_by
- head([n]) 返回前n行
- hint(name, *parameters)
- inputFiles()
- intersect(other)
- intersectAll(other)
- isLocal()
- join(other, on, how)
- limit(num)
- localCheckpoint([eager])
- mapInPandas(func, schema)
- orderBy(*cols, **kwargs)
- persist([storageLevel])
- printSchema()
- randomSplit(weights[, seed])
- registerTempTable(name)
- repartition(numPartitions, *cols)
- repartitionByRange(numPartitions, *cols)
- replace(to_replace, value, subset)
- rollup(*cols)
- sameSemantics(other)
- sample([withReplacement, fraction, seed])
- sampleBy(col, fractions[, seed])
- select(*cols)
- selectExpr(*expr)
- semanticHash()
- show([n, truncate, vertical])
- sort(*cols, **kwargs)
- sortWithinPartitions(*cols, **kwargs)
- subtract(other)
- summary(*statistics)
- tail(num)
- take(num)
- toDF(*cols)
- toJSON([use_unicode])
- toLocalIterator([prefetchPartitions])
- toPandas()
- transform(func)
- union(other)
- unionAll(other)
- unionByName(other[, allowMissingColumns])
- unpersist([blocking])
- where(condition)
- withColumn(colName, col)
- withColumnRenamed(existing, new)
- withWatermark(eventTime, delayThreshold)
- writeTo(table)
- DataFrame属性
- pyspark 自定义函数
- spark 调优思路
为什么用
python中pandas是数据分析的利器,具有并行的特兹那个,而且函数和数据计算的方法非常方便,是数据分析中的瑞士军刀。但是受限于单个机器性能和配置的限制,当大规模数据,比如100G-10TB规模的数据时,pandas就显得局限了,就像瑞士军刀杀牛,难以下手。这时就需要基于分布式计算的大数据工具spark,是基于分布式计算,可以基于hadoop和hive,进行分布式的数据计算,同时spark具有python API,可以通过类似python的语法,无门槛的过渡。
怎么用
pyspark支持RDD和DataFrame的数据类型,但是RDD在python中相比于scala和R语言,是非常慢的,而DataFrame使性能在各种语言中都保持稳定。所以我们可以试用pyspark的DataFrame对大规模数据进行数据清理,然后转为pandas.dataframe,进行数据可视化。
初始化类 class pyspark.sql.SparkSession 类
spark = SparkSession.builder \
... .master("local") \
... .appName("Word Count") \
... .config("spark.some.config.option", "some-value") \
... .getOrCreate
Builder for SparkSession 这个就是生成一个 sparksession 实例。他下面有一些支持的函数
master: 设置 spark master 的 url 。由于我们集群使用的是 spark on yarn 的模式,所以可以用选择不设置这个参数。
appName: 在程序运行的时候看到的应用名称。
config: 其实其他参数也是调用 .config 设置相应的 config 参数,例如 .master 就是调用了 .config(“spark.master”, master)。
enableHiveSupport: 启动对 hive 的支持。例如支持 hivesql 以及 hive udf 等。
getOrCreate: 得到一个现成的 SparkSession ,如果没有就生成一个。
- SparkSession.catalog:
提供一个接口来操作 create drop alter query 库或者表,比如:
catalog.listTables().select($"name").show(2,false)
- SparkSession.createDataFrame:
可以获得从 rdd python list 和 pandas df 创建 df 的能力。下面贴一下官方的例子:
l = [('Alice', 1)]
>>> spark.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> spark.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]
>>> d = [{
'name': 'Alice', 'age': 1}]
>>> spark.createDataFrame(d).collect()
[Row(age=1, name=u'Alice')]
>>> rdd = sc.parallelize(l)
>>> spark.createDataFrame(rdd).collect()
[Row(_1=u'Alice', _2=1)]
>>> df = spark.createDataFrame(rdd, ['name', 'age'])
>>> df.collect()
[Row(name=u'Alice', age=1)]
- SparkSession.sql:
使用sql方法返回的是df,例如:
>>> df.createOrReplaceTempView("table1")
>>> df2 = spark.sql("SELECT field1 AS f1, field2 as f2 from table1")
>>> df2.collect()
[Row(f1=1, f2=u'row1'), Row(f1=2, f2=u'row2'), Row(f1=3, f2=u'row3')]
- SparkSession.table
这个可以返回指定表的 df ,将表复制成df
函数说明
注意查看官方文档中函数说明的返回数据类型
- 查询
1,.show(n),方法默认显示前10行
2,spark.sql("select * from ").collect()
利用DataFrame API查询
- swimmers.count() 返回dataframe 的行数
- swimmers.select().filter().show() 返回筛选后数据
利用sql查询
- spark.sql(“select count(1) from swimmers”).show()
sql语句和sql语言一致,也可以试用where 筛选
DataFrame函数说明
创建DataFrame
1.使用RDD来创建
rdd = sc.parallelize([("Sam", 28, 88), ("Flora", 28, 90), ("Run", 1, 60)])
df = rdd.toDF(["name", "age", "score"])
df.show()
df.printSchema()
# +-----+---+-----+
# | name|age|score|
# +-----+---+-----+
# | Sam| 28| 88|
# |Flora| 28| 90|
# | Run| 1| 60|
# +-----+---+-----+
# root
# |-- name: string (nullable = true)
# |-- age: long (nullable = true)
# |-- score: long (nullable = true)
2. 使用python的DataFrame来创建
df = pd.DataFrame([['Sam', 28, 88], ['Flora', 28, 90], ['Run', 1, 60]],
columns=['name', 'age', 'score'])
print(">> 打印DataFrame:")
print(df)
print("\n")
Spark_df = spark.createDataFrame(df)
print(">> 打印SparkDataFrame:")
Spark_df.show()
# >> 打印DataFrame:
# name age score
# 0 Sam 28 88
# 1 Flora 28 90
# 2 Run 1 60
# >> 打印SparkDataFrame:
# +-----+---+-----+
# | name|age|score|
# +-----+---+-----+
# | Sam| 28| 88|
# |Flora| 28| 90|
# | Run| 1| 60|
# +-----+---+-----+
3. 使用List来创建
list_values = [['Sam', 28, 88], ['Flora', 28, 90], ['Run', 1, 60]]
Spark_df = spark.createDataFrame(list_values, ['name', 'age', 'score'])
Spark_df.show()
# +-----+---+-----+
# | name|age|score|
# +-----+---+-----+
# | Sam| 28