zoukankan      html  css  js  c++  java
  • spark教程(七)-文件读取案例

    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

  • 相关阅读:
    《数据通信与网络》笔记--数据链路层的成帧
    设计模式10---设计模式之原型模式(Prototype)
    Yii 控制dropdownlist / select 控件的宽度和 option 的宽度
    [置顶] 如何vs在cocos2dx项目中打印中文
    mongodb实现简单的增删改查
    北京和硅谷在创新方面的区别
    Android 解决Gallery下ScrollView滑动事件冲突
    Java 授权内幕--转载
    JAVA 上加密算法的实现用例---转载
    基于事件的 NIO 多线程服务器--转载
  • 原文地址:https://www.cnblogs.com/yanshw/p/11655677.html
Copyright © 2011-2022 走看看