PySpark 学习笔记(二) 简单的SQL查询

记得原来看到一个类似官方文档的quick start页面,我是照着它写的,但找不到了,如果有人告诉我将十分感谢。

Why SQL

以下只代表本人的理解。
可以支持SQL的一系列数据库操作是Spark的一大特性,当数据量很大时,传统的单机数据库无法负载。Spark可以把文件的数据内容读到内存中进行操作,所以只要集群资源足够,很多SQL的操作是很快的!

以一个实际任务作为例子

HDFS上BOSS把一些数据放到了我的文件夹下,这就是我要处理的数据了,这次只是做一个简单的统计任务。
hdfs dfs -ls看了一下,发现在目标文件夹下数据被分成了很多份,类似这样 :part-r-.result,其中是按数字顺序的。具体的我还不了解,估计是和分布式的一些特性有关吧。(我这里埋了个隐患)

开始写python代码

pyspark程序中,有一个概念:SparkSession,以目前我粗浅的理解,这相当于一个上下文环境,有了它你才好做一系列事情。
先来 from pyspark.sql import SparkSession
然后获取将要用到的Session,这边给个例子吧:
spark = SparkSession.builder.appName("test1").getOrCreate()

读取DataFrame

然后之前提过的,已经配置过默认的文件路径是在HDFS上,以JSON文件为例,你可以这样读取:
logData = spark.read.json(logFile)
logFile是你要读取的文件路径。
但是文件那么多份怎么读呢,我走了一些弯路这里记录一下

方法一:Union(很麻烦不推荐)

就是文件一个一个读成DataFrame,然后union多个DataFrame,这是我一开始想到的办法,结果运行起来耗时很多很多。
一个小tip:文件名是part-00000.res,part-00001.res,格式化输入:

for i in range(1,800):
    file_path="active_token/part-r-%05d.result" % (i)
    data_append= spark.read.json(file_path)
    data_append= data_append.select(data_append['app_name'],data_append['identifier'])
    ogData=logData.union(data_append)
    print("file %d processed," % (i) )

最后logData就是union了全部的,你想要的data......

方法二:通配符读取(推荐)

写完上面的代码,跑得贼慢,我觉得不对啊,这个读取文件作为DataFrame应该是一个常规操作,怎么会这么麻烦呢?于是我问了一下同事......
原来可以用通配符代表多个文件一次读取。你把文件名写成这样:"filePath/*"一次读取就成了,啊啊啊啊啊。

SQL查询

DataFrame要支持原生的SQL直接查询是需要创建视图的。
logData.createOrReplaceTempView("total_data")
然后你就可以
DF=spark.sql("SELECT DISTINCT name,id FROM total_data WHERE app_name!='' AND identifier!='' ")
类似这样的查询,注意spark前面声明过,是Session,语句返回的也是一个DataFrame
DF.show()可以看一看格式化输出的DF。

猜你喜欢

转载自www.cnblogs.com/hapoyige/p/9378413.html