pySpark数据分析(一)

pySpark数据分析(一)

我安装的版本是spark 2.4.3和hadoop 2.7.7(或只安装winutils),配置好环境变量。

一、驱动器SparkSession初始化

驱动器程序通过对象SparkContext(即sc)连接spark集群,在spark shell中会自动初始化sc,但python和scala编写的spark程序中需要自定义一个sc。运行会出现一些WARN。

import findspark
findspark.init()

from pyspark import SparkConf, SparkContext

# setMaster为集群URL:即让spark连接到指定集群上,local指的是单机单线程运行,而不必运行在集群上
conf = SparkConf().setMaster("local").setAppName("name")
sc = SparkContext(conf=conf)  # 定义驱动器对象,sparksession的子对象
spark = SparkSession(sc)

# 关闭sc
sc.stop()
  • error1:the environment is inconsistent,耗时会有点久。

解决:更新conda

conda activate base
conda install anaconda
conda update --all

参考链接

  • error2:Solving environment: failed

看到有的说是C:\Users\\.condarc的问题,但对文件进行修改或删除后还是偶尔会出现这样的情况。

参考链接

  • error3:PackagesNotFoundError: The following packages are not available from current channels

使用虚拟环境中的pip进行安装即可:D:\Anaconda3\envs\spark\Scripts\pip.exe install findspark

  • error4:未使用findspark时报错:org.apache.spark.api.python.PythonUtils.isEncryptionEnabled does not exist in the JVM

    使用findspark.init()时报错:TypeError: ‘bytes’ object cannot be interpreted as an integer

原因:pyspark版本需要与python版本相匹配

pyspark版本:3.3.1

python版本:3.10.8

解决:使用更低版本的python,我换成了3.7,解决一些包冲突要等挺久。最后更新一下解释器路径。

参考链接

  • error5:Failed to locate the winutils binary in the hadoop binary path

原因:hadoop的bin目录下没有winutils.exe文件(可能是因为版本原因)

解决:JAVA_HOME环境变量不能有空格;下载一个放入bin目录下,重启一下或加上代码

System.setProperty("hadoop.home.dir", "E:\\Program Files\\hadoop-2.7.0")

参考链接

二、pyspark使用测试

使用pysaprk读取数据并计算元素个数:

def count_line(stream):
	numlines = stream.count()
    stream.show(10)
    print(numlines)
    # multiLine=False:12762 
    # multiLine=True:2184 
    # 期望:12492

# 读取文件
file_path = "F:/Study/spark/dataset/myntra_products_catalog.csv"
# data = sc.textFile(file_path)  # 无法多行读取
spark = SparkSession(sc)
data = spark.read.csv(file_path, multiLine=True, inferSchema= True, header=True)
count_line(data)

pyspark程序运行后可以在http://localhost:4040查看到spark提供的WEB UI界面。由于程序运行完后会关闭spark的驱动器,从而导致连接失败,故需在程序末尾加个空循环再访问。

  • error1:发现行数实际输出与预期输出不匹配,设置读取参数multiLine=True后更是只有2184行。

将读取到的数据保存发现还是有12492行,查阅资料发现使用sparksession读取文件后会返回dataframe格式而不是rdd。考虑到count()是输出rdd中的元素数,故尝试将读取到的data转成rdd。

解决:将numlines = stream.count()改成numlines = stream.rdd.count(),输出为12491。

参考链接

dataframe与rdd的区别

  • error2:ERROR:root:Exception while sending command.

    ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

    ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

原因:看文献说是Spark 限制了内存使用导致引发错误。

解决:通过conf修改spark的配置、增加内存,如下。

conf = SparkConf().setMaster("local").setAppName("name").set('spark.executor.memory', '15G')

参考链接

你可能感兴趣的:(数据分析,spark,python)