Более удобный способ воспроизвести образец pyspark - PullRequest
1 голос
/ 28 марта 2019

Большинство вопросов о свече используются show в качестве примера кода без кода, который генерирует информационный кадр, например:

df.show()
+-------+--------+----------+
|USER_ID|location| timestamp|
+-------+--------+----------+
|      1|    1001|1265397099|
|      1|    6022|1275846679|
|      1|    1041|1265368299|
+-------+--------+----------+

Как я могу воспроизвести этот код в моей среде программирования, не переписывая его вручную? у pyspark есть какой-то эквивалент read_clipboard в пандах?


Редактировать

Отсутствие функции для импорта данных в мою среду является большим препятствием для меня, чтобы помочь другим с pyspark в Stackoverflow.

Итак мой вопрос:

Какой самый удобный способ воспроизвести данные, вставленные в stackoverflow из команды show, в мою среду?

Ответы [ 4 ]

2 голосов
/ 22 апреля 2019

Поздний ответ, но я часто сталкиваюсь с той же проблемой, поэтому написал небольшую утилиту для этого https://github.com/ollik1/spark-clipboard

Это в основном позволяет вставлять копии данных во фрейме данных копирования. Чтобы установить его, добавьте jcenter dependency com.github.ollik1:spark-clipboard_2.12:0.1 и spark config .config("fs.clipboard.impl", "com.github.ollik1.clipboard.ClipboardFileSystem"). После этого фреймы данных могут быть считаны непосредственно из системного буфера обмена

.
val df = spark.read
  .format("com.github.ollik1.clipboard")
  .load("clipboard:///*")

или альтернативные файлы, если вы предпочитаете. Подробности установки и использования описаны в файле read me.

2 голосов
/ 30 марта 2019

Вы всегда можете использовать следующую функцию:

from pyspark.sql.functions import *

def read_spark_output(file_path):
    step1 = spark.read \
             .option("header","true") \
             .option("inferSchema","true") \
             .option("delimiter","|") \
             .option("parserLib","UNIVOCITY") \
             .option("ignoreLeadingWhiteSpace","true") \
             .option("ignoreTrailingWhiteSpace","true") \
             .option("comment","+") \
             .csv("file://{}".format(file_path))
    # select not-null columns
    step2 = t.select([c for c in t.columns if not c.startswith("_")])
    # deal with 'null' string in column
    return step2.select(*[when(~col(col_name).eqNullSafe("null"), col(col_name)).alias(col_name) for col_name in step2.columns])

Это одно из предложений, приведенных в следующем вопросе: Как создать хорошие воспроизводимые примеры Apache Spark .

Примечание 1: Иногда могут быть особые случаи, когда это может не применяться по тем или иным причинам и которые могут генерировать ошибки / проблемы, например Группировать по столбцам"grp" и сжимать DataFrame - (принять последнее ненулевое значение для каждого столбца, упорядочивая по столбцу "ord") .Поэтому, пожалуйста, используйте его с осторожностью!

Примечание 2: (Отказ от ответственности) Я не являюсь первоначальным автором кода.Спасибо @MaxU за код.Я только что сделал некоторые изменения на нем.

1 голос
/ 28 марта 2019

Вы всегда можете прочитать данные в pandas как фрейм данных pandas, а затем преобразовать их обратно в фрейм данных spark.Нет, в pyspark нет прямого эквивалента read_clipboard в отличие от pandas.

Причина заключается в том, что кадры данных Pandas в основном являются плоскими структурами, где в качестве искровых фреймов данных могут использоваться сложные структуры, такие как struct, arrays и т. Д., Поскольку он имеет широкийРазнообразие типов данных и те, которые не отображаются в выводе консоли, невозможно воссоздать кадр данных из вывода.

0 голосов
/ 30 марта 2019

Вы можете объединить panda read_clipboard и конвертировать в pyspark dataframe

from pyspark.sql.types import *

pdDF = pd.read_clipboard(sep=',', 
                       index_col=0, 
                       names=['USER_ID', 
                              'location',
                              'timestamp',
                              ])



mySchema = StructType([ StructField("USER_ID", StringType(), True)\
                       ,StructField("location", LongType(), True)\
                       ,StructField("timestamp", LongType(), True)])

#note: True (implies nullable allowed)


df = spark.createDataFrame(pdDF,schema=mySchema)

Обновление:

Что действительно нужно @terry - это скопировать таблицу кодов ASCII в python,и следующий пример.Когда вы анализируете данные в python, вы можете преобразовать их во что угодно.

def parse(ascii_table):
    header = []
    data = []
    for line in filter(None, ascii_table.split('\n')):
        if '-+-' in line:
            continue
        if not header:
            header = filter(lambda x: x!='|', line.split())
            continue
        data.append(['']*len(header))
        splitted_line = filter(lambda x: x!='|', line.split())
        for i in range(len(splitted_line)):
            data[-1][i]=splitted_line[i]
    return header, data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...