我是Docker和pyspark的新手。。。
我有一个在python3.7-alpine上运行的docker映像。现在我只想将csv文件读取到spark数据帧中
spark = SparkSession.
builder.
appName("pythonfile").
master("spark://spark-master:7077").
config("spark.executor.memory", "512m").
getOrCreate()
spark.read.option('header', True).csv('Crimes_2001_to_Present.csv')
但我得到了一个:
java.io.FileNotFoundException: File file:/Crimes_2001_to_Present.csv does not exist
在我尝试读取csv之前,我打印出了我当前的工作目录以及该工作目录中的所有文件夹和文件
print(os.getcwd())
print(os.listdir())
我的bash正在打印csv文件在该目录中:
pythonfile_1 | /
pythonfile_1 | ['home', 'srv', 'etc', 'opt', 'root', 'lib', 'mnt', 'usr', 'media', 'sys', 'dev',
'sbin', 'bin', 'run', 'proc', 'tmp', 'var', 'data', '__pycache__', '.dockerenv',
'Crimes_2001_to_Present.csv', 'Get_data.py', 'Main.py', 'Transform_data.py']
有人知道——或者给我一个提示——为什么pyspark找不到这个csv吗?
pyspark version = 3.0.1
spark_version = 3.0.1
hadoop_version = 2.7
提前感谢:(
我的解决方案:
我不得不使用Ubuntu映像作为docker映像。我在这个docker镜像上安装了python pyspark和spark。Dockerfile:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y openjdk-8-jdk
RUN apt-get update
RUN apt-get install git -y
RUN apt-get update
RUN apt-get install wget -y
COPY handler.py /
COPY Crimes.csv /
RUN wget 'https://downloads.apache.org/spark/spark-3.0.1/spark-3.0.1-bin-
hadoop2.7.tgz'
RUN tar -xzvf spark-3.0.1-bin-hadoop2.7.tgz
RUN rm spark-3.0.1-bin-hadoop2.7.tgz
RUN apt-get install -y python3-pip python3-dev python3
RUN apt-get update
RUN pip3 install --upgrade pip
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN pip install pyspark
RUN sed -i.py 's/r$//' handler.py
CMD ./spark-3.0.1-bin-hadoop2.7/bin/spark-submit --master spark://spark-master:7077 --
files Crimes.csv ./handler.py
带有--files的spark-submit命令正在将csv上载到master和所有slave。在这之后,我能够在CSV文件中读取以下代码:
from pyspark.sql import SparkSession
from pyspark import SparkFiles
spark = SparkSession.builder.appName("pysparkapp").config("spark.executor.memory",
"512m").getOrCreate()
sc = spark.sparkContext
df = sc.textFile(SparkFiles.get('Crimes.csv'))
get('fileName'(从spark系统中的文件获取路径,该文件是用spark-submit--files命令上传的。