Pyspark SQL Проблема загрузки файла TSV в качестве кадра данных - PullRequest
1 голос
/ 11 апреля 2020

У меня есть следующие данные в виде .txt файла в формате табуляций , хранящиеся в моем хранилище BLOB-объектов. Я использую pyspark. sql для загрузки данных в блоки данных как pyspark. sql .df.

Это форма данных.

df = spark.createDataFrame(
    [
    (302, 'foo'), # values
    (203, 'bar'),
    (202, 'foo'),
    (202, 'bar'),
    (172, 'xxx'),
    (172, 'yyy'),
],
['LU', 'Input'] # column labels
)

display(df)

Сначала я создал схему для данных перед загрузкой:

from pyspark.sql.types import *

data_schema = [
           StructField('LU', StringType(), True), 
           StructField('Input', StringType(), True)]

mySchema = StructType(fields=data_schema)

Затем я использую следующий код для считывания данных:

df = spark.read.csv("/filepath/filename.txt", schema=mySchema , header=True)
df.show() 

Однако, когда я смотрю на данные, первый столбец выглядит нормально, но значения второго столбца отображаются как ноль.

+----------+-----+
|        LU|Input|
+----------+-----+
|302       | null|
|203       | null|
|202       | null|
|202       | null|
|172       | null|
|172       | null|
+----------+-----+

Кто-нибудь знает, почему переменная 'Input' отображается как ноль? Это просто фиктивные данные, при использовании реальных данных, имеющих более 30 переменных, загружаются только первые значения переменных, все остальное равно нулю.

Спасибо

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Чтобы избежать этой проблемы в будущем, возможно, стоит сначала вывести схему и сохранить ее как json, а для будущих чтений вы можете использовать эту схему обратно. Это позволит избежать ошибок при создании схемы вручную.

df.schema.json()
0 голосов
/ 15 апреля 2020

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

>>> df = spark.read.csv("file:////Users/sam/Downloads/file.txt",  inferSchema=True, header=True, sep='\t')
>>> df.show()
+---+-----+
| LU|Input|
+---+-----+
|302| foo |
|203|  bar|
|202|  foo|
|202|  bar|
|172|  xxx|
|172|  yyy|
+---+-----+

>>> df.printSchema()
root
 |-- LU: integer (nullable = true)
 |-- Input: string (nullable = true)

Блоки данных иногда не показывают правильный результат. Итак, пусть Spark сначала определит данные, а затем вы попытаетесь понять, в чем проблема с вашей схемой, а затем предпринять корректирующие действия.

Я подозреваю, что вы должны использовать LongType для 1-го поля, но сравните его. Прикрепление образца для справки. Поскольку я не уверен насчет самого файла, я просто указываю вам в этом направлении. enter image description here

0 голосов
/ 14 апреля 2020

Я выяснил, в чем проблема с моими данными. В моей схеме у меня было:

StructField('Date', DateType()

на дату, например, 13.03.2000. Вы не можете принудительно ввести такую ​​дату в DateType в схеме, только 13-03-2000.

Это означает, что при применении схемы ко всем переменным все они возвращали нули, даже если только одна переменная потерпел неудачу.

Надеюсь, это поможет некоторым.

...