spark的DataFrame与python的DataFrame类似,但是其处理速度远快于无结构的RDD。
Spark 2.0 用 SparkSession 代替了SQLContext。各种 Spark contexts,包括:HiveContext, SQLContext, StreamingContext,以及SparkContext 全部合并到了SparkSession中,以后仅用这一个包作为读取数据的入口。
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("Python Spark SQL basic example")\
.config("spark.some.config.option", "some-value")\
.getOrCreate()
sc = spark.sparkContext
方法一:构建并生成
#生成json数据
stringJSONRDD = sc.parallelize(
("""{"id":"1","name":"a","age":"20"}""",
"""{"id":"2","name":"b","age":"21"}""",
"""{"id":"3","name":"c","age":"22"}""")
)
# 创建DataFrame
peopleJSON = spark.read.json(stringJSONRDD)
#创建临时表
peopleJSON.createOrReplaceTempView("peopleJSON")
peopleJSON.show()
+---+---+----+
|age| id|name|
+---+---+----+
| 20| 1| a|
| 21| 2| b|
| 22| 3| c|
+---+---+----+
或者通过编程指定模式
# 导入类型
from pyspark.sql.types import *
# 生成以逗号分隔的数据
stringCSVRDD = sc.parallelize([
(1,'a',20),
(2,'b',21),
(3,'c',22)
])
# 指定模式
schema = StructType([
StructField('id',LongType(),True),
StructField('name',StringType(),True),
StructField('age',LongType(),True)
])
# 创建DateFrame
people = spark.createDataFrame(stringCSVRDD,schema)
# 利用DataFrame创建临时视图
people.createOrReplaceTempView('people')
方法二:直接导入
csv_data = spark.read.option("charset", "utf-8")\
.option("header", "true")\
.option("quote", "\"")\
.option("delimiter", ",")\
.csv('E:\PythonWorkSpace\Tencent2020\data\\train_preliminary\\user.csv')
csv_data .show(10)
+-------+---+------+
|user_id|age|gender|
+-------+---+------+
| 1| 4| 1|
| 2| 10| 1|
| 3| 7| 2|
| 4| 5| 1|
| 5| 4| 1|
| 6| 6| 1|
| 7| 6| 2|
| 8| 5| 1|
| 9| 5| 1|
| 10| 9| 2|
+-------+---+------+
csv_data .count()
900000
csv_data .select('user_id','age').filter('age==2').show(10)
+-------+---+
|user_id|age|
+-------+---+
| 18| 2|
| 28| 2|
| 32| 2|
| 38| 2|
| 49| 2|
| 52| 2|
| 61| 2|
| 64| 2|
| 69| 2|
| 70| 2|
+-------+---+
only showing top 10 rows
csv_data .createOrReplaceTempView('csv_data ')
spark.sql('select count(csv_data .age) from csv_data ').show()
+----------+
|count(age)|
+----------+
| 900000|
+----------+
spark.sql('select user_id ,age from csv_data where age=2').show(10)
+-------+---+
|user_id|age|
+-------+---+
| 18| 2|
| 28| 2|
| 32| 2|
| 38| 2|
| 49| 2|
| 52| 2|
| 61| 2|
| 64| 2|
| 69| 2|
| 70| 2|
+-------+---+
only showing top 10 rows