Функции pandas не работают при использовании pyspark в jupyter под Ubuntu на виртуальной машине - PullRequest
0 голосов
/ 08 февраля 2019

Я изучаю pyspark.Итак, вот как я создаю среду:

1. ubuntu in virtual machine
2. downloading spark 2.4.0
3. install pyspark using pip
4. configuring environment path: 
    export SPARK_HOME="/home/feng/Downloads/spark-2.4.0-bin-hadoop2.7/"
    export PATH=$SPARK_HOME/bin:$PATH
    export PYSPARK_DRIVER_PYTHON=jupyter
    export PYSPARK_DRIVER_PYTHON_OPTS='notebook' 

Тогда я могу использовать pyspark в jupyter.Первые строки здесь, чтобы обнаружить искру:

import findspark
findspark.init()
import pyspark

Теоретически, я должен сейчас использовать pyspark.Но, пожалуйста, посмотрите следующие два примера:

Пример 1:

import findspark
findspark.init()
import pyspark
from pyspark.sql import SparkSession
import matplotlib.pyplot as plt
import pandas as pd

data1 = {'PassengerId': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
     'Name': {0: 'Owen', 1: 'Florence', 2: 'Laina', 3: 'Lily', 4: 'William'},
     'Sex': {0: 'male', 1: 'female', 2: 'female', 3: 'female', 4: 'male'},
     'Survived': {0: 0, 1: 1, 2: 1, 3: 1, 4: 0}}

data2 = {'PassengerId': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
     'Age': {0: 22, 1: 38, 2: 26, 3: 35, 4: 35},
     'Fare': {0: 7.3, 1: 71.3, 2: 7.9, 3: 53.1, 4: 8.0},
     'Pclass': {0: 3, 1: 1, 2: 3, 3: 1, 4: 3}}

df1_pd = pd.DataFrame(data1, columns=data1.keys())
df2_pd = pd.DataFrame(data2, columns=data2.keys())

df1 = spark.createDataFrame(df1_pd)
df2 = spark.createDataFrame(df2_pd)
df1.show()
df1.filter(df1.Survived ==0 ).show()

Результат:

+-----------+--------+--------+------+
|PassengerId|    Name|Survived|   Sex|
+-----------+--------+--------+------+
|          1|    Owen|       0|  male|
|          2|Florence|       1|female|
|          3|   Laina|       1|female|
|          4|    Lily|       1|female|
|          5| William|       0|  male|
+-----------+--------+--------+------+

+-----------+-------+--------+----+
|PassengerId|   Name|Survived| Sex|
+-----------+-------+--------+----+
|          1|   Owen|       0|male|
|          5|William|       0|male|
+-----------+-------+--------+----+

Пример 2:

import findspark
findspark.init()
import pyspark
from pyspark.sql import SparkSession
import matplotlib.pyplot as plt
import pandas as pd

spark=SparkSession.builder.getOrCreate()
df = spark.read.csv("/home/feng/Downloads/spark-2.4.0-bin-hadoop2.7/examples/src/main/resources/people.csv",
                header=True)
df.show()  


df.filter(df.age > 20 ).show()

Результат:

+------------------+
|      name;age;job|
+------------------+
|Jorge;30;Developer|
|  Bob;32;Developer|
+------------------+

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-429ca6587743> in <module>()
 12 
 13 
---> 14 df.filter(df.age > 20 ).show()

/home/feng/Downloads/spark-2.4.0-bin-hadoop2.7/python/pyspark/sql/dataframe.pyc in __getattr__(self, name)
   1298         if name not in self.columns:
   1299             raise AttributeError(
-> 1300                 "'%s' object has no attribute '%s'" % 
(self.__class__.__name__, name))
   1301         jc = self._jdf.apply(name)
   1302         return Column(jc)

AttributeError: 'DataFrame' object has no attribute 'age'

. Вы можете видеть, что в этих двух примерах функция show () имеет другой результат.Первый лучше, чем второй.А для функции filter () у второго есть ошибка, но первое хорошо.

Я думаю, что единственное различие (я, вероятно, ошибаюсь в этом) между этими двумя примерами состоит в том, что первый используетнебольшой кадр данных, сгенерированный в коде, в то время как второй считывает данные из файла CSV.

Итак, что мне следует сделать, чтобы прочитать данные и правильно их проанализировать?

1 Ответ

0 голосов
/ 08 февраля 2019

При чтении CSV-файла Spark разделяет столбцы на запятые (,).Если вы проверите файл, вы обнаружите, что столбцы разделены ;.В этом случае Spark интерпретирует (правильно), что вся строка принадлежит одному столбцу.Вот почему результаты .show() отличаются, у вас есть только один столбец во втором примере.

Чтобы правильно прочитать данные, измените разделитель при чтении:

spark.read.option("delimiter", ";").option("header", "true").csv(file)
...