sparkSession 读取 csv

1. 利用 sparkSession 作为 spark 切入点

2. 读取 单个 csv 和 多个 csv

from pyspark.sql import SparkSession
from pyspark.sql import SQLContext if __name__ == '__main__':
scSpark = SparkSession \
.builder \
.appName("reading csv") \
.getOrCreate() # getOrCreate 获取现有 SparkSession 或者 新建一个 SparkSession print(scSpark.sparkContext) data_file = 'csvdata/*.csv' # 读取 csvdata 文件夹下所有 csv 文件,但是这些 csv 文件格式必须相同,也就是 列 相同
# data_file = 'xx.csv' # 读取单个 csv 文件
sdfData = scSpark.read.csv(data_file, header=True, sep=",").cache() # .cache 缓存返回data,从而提高性能
print('Total Records = {}'.format(sdfData.count()))
sdfData.show()

读取一个文件夹下多个 csv 时,务必保持 csv 格式相同,否则会警告,但不报错

19/10/15 02:29:32 WARN CSVDataSource: Number of column in CSV header is not equal to number of fields in the schema:
Header length: 2, schema size: 4 19/10/15 02:29:32 WARN CSVDataSource: CSV header does not conform to the schema.

各种模式读取文件

一个小项目:计算 GPS 频次

原数据长这样

1,108.99564,34.33999999,1
2,108.99564,34.3399087138298,1
3,108.99564,34.3398174376596,1
4,108.99564,34.3397261614894,1
5,108.99564,34.3396348853192,1
6,108.99564,34.3395436091489,1
7,108.99564,34.3394523329787,1
8,108.99564,34.3393610568085,1

Standalone 模式读取本地文件

在 local 模式下,文件无特殊要求

在 standalone 模式下读取本地文件,这个文件必须在每个节点上都存在,且路径一致

简易代码

from __future__ import division
from pyspark import SparkContext max_lng = 136
min_lng = 73
max_lat = 54
min_lat = 3
lng_stage = 1000
lat_stage = 1000 lng_step=(max_lng - min_lng) / (lng_stage)
lat_step=(max_lat - min_lat) / (lat_stage) def mymap(data):
# print(data, 1111111111111111111111111111111111)
return data.split(',') def mygroup(data):
# 对经纬度分区,打标签
# print(data[1], type(data[1]))
label_lng = round(float(data[1]) / lng_step, 1)
label_lat = round(float(data[2]) / lat_step, 1)
return (label_lng, label_lat) def mapkey(data):
# 把标签还原成经纬度
return data[0][0] * lng_step, data[0][1] * lat_step, data[1] # sc = SparkContext('local', 'gpsfreq') # 本地模式
sc = SparkContext('spark://hadoop10:7077', 'gpsfreq') # standalone 模式
rdd = sc.textFile('dwd.csv', 100) # standalone 模式 读取本地文件,必须在每个节点上都有这个文件,且路径一致 # print rdd.map(mymap).collect()
print rdd.map(mymap).groupBy(mygroup).mapValues(len).map(mapkey).collect()

输出长这样

[(111.8943, 32.629799999999996, 11), (109.2861, 34.2006, 42), (109.0467, 35.2155, 77), (111.72420000000001, 33.1755, 11), (111.636, 32.8542, 7)]

Standalone 模式读取 hdfs

需要启动 hadoop,并把数据传到 hdfs

hadoop fs -mkdir /spark
hadoop fs -put dwd.csv /spark

第一节中的代码只需改动一句

rdd = sc.textFile('hdfs://hadoop10:9000/spark/dwd.csv')

spark on yarn 模式读取 hdfs

yarn 模式只能读取分布式数据,如 hdfs

异常记录

1. 读取本地文件会出现  文件不存在

2. 如下异常

Caused by: org.apache.spark.SparkException:
Error from python worker:
/usr/bin/python: No module named pyspark
PYTHONPATH was:
/usr/lib/hadoop-2.6.5/tmp/nm-local-dir/usercache/root/filecache/46/__spark_libs__6155997154509109577.zip/spark-core_2.11-2.4.4.jar

解决方法

conf = SparkConf().setAppName('gps').setMaster('yarn')
# 下面两句解决 No module named pyspark
conf.set('spark.yarn.dist.files','file:/usr/lib/spark/python/lib/pyspark.zip,file:/usr/lib/spark/python/lib/py4j-0.10.7-src.zip')
conf.setExecutorEnv('PYTHONPATH','pyspark.zip:py4j-0.10.7-src.zip') sc = SparkContext(conf=conf)
# yarn 模式必须读取 集群 中的文件,不能读本地
rdd = sc.textFile('hdfs://hadoop10:9000/spark/dwd.csv')

我重启机器后发现没有这两句竟然也可以,所以这里作为参考

spark-submit 命令:即使我在代码里指定了 master 为 yarn,spark-submit 运行时仍需指定 master,否则报错 No module named pyspark  【上面第二个异常】

bin/spark-submit --master yarn gpsfreq.py    # 参数必须在 py 文件前面

python 命令:如果是 python 命令执行,无需额外指定 master

python gpsfreq.py

我的理解是 spark 无法找到 pyspark,因为 spark 并没有在任何地方和 pyspark 关联;

而 python 可以找到 pyspark,因为在 PYTHONPATH 中设置了 pyspark 的搜索路径

export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/pyspark:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH

参考资料:

http://spark.apache.org/docs/latest/api/python/index.html  官网

https://www.360kuai.com/pc/99c84010bb76fd1fa?cota=4&kuai_so=1&sign=360_57c3bbd1&refer_scene=so_1

https://blog.csdn.net/cjhnbls/article/details/79254188

最新文章

  1. Java Web ——http协议响应报文
  2. 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
  3. rabbitmq_config
  4. vijos1144(小胖守皇宫)
  5. Android logcat
  6. 【SDOI2009】解题汇总
  7. ORA-29339错误解决办法
  8. linux cmd: linux下解压命令大全
  9. zencart的modules下数据库操作templates排版和common首页引用
  10. 进程间通信系列 之 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
  11. CSS样式链接和文字常用属性
  12. Linux/Unix/Mac OS下的远程访问和文件共享方式
  13. 【Mysql】MySQL event 计划任务
  14. stl中的for_each() 函数的注意事项
  15. JVM 堆参数调优 (四)
  16. CSS 样式属性
  17. IIS7.5 配置虚拟目录的经历
  18. English trip M1 - PC12 I'd Like a Room Please Teacher:Taalan
  19. Windows Server2008 R2性能优化方法
  20. python3和2的区别

热门文章

  1. Spring Boot教程(三十五)使用MongoDB数据库(1)
  2. 「CTSC 2008」祭祀
  3. Linux TCP自连接问题
  4. ai笔记
  5. 20191114-3 Beta阶段贡献分配
  6. 表视图为Group类型的注意问题
  7. C基础知识(5):指针--传递指针给函数&返回指针的函数
  8. C基础知识(4):指针--p=&a和*p=a的区别详解
  9. JavaScript(2):函数
  10. CentOS7 执行yum 命令出错