【问题标题】:Pyspark SQL Issue loading a tsv file as a dataframePyspark SQL 问题将 tsv 文件加载为数据框
【发布时间】:2020-07-24 04:11:19
【问题描述】:

我将以下数据作为 .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|
+----------+-----+

有谁知道为什么“输入”变量显示为空?这只是虚拟数据,当使用具有 30 多个变量的真实数据时,只会加载第一个变量值,其他所有值都为空。

谢谢

【问题讨论】:

  • 您可以从文件中添加示例记录吗?
  • @Shu 我不明白你的意思?
  • 从/filepath/filename.txt文件中添加一些示例数据..
  • @Shu 我不认为你可以添加一个数据文件到堆栈溢出?你是怎么做到的?
  • @Mrmoleje:试试:df = spark.read.csv("/filepath/filename.txt", schema=mySchema , header=True, sep='\t')。您可以将一些行作为纯文本添加到您的问题中。

标签: pyspark pyspark-sql


【解决方案1】:

为了避免以后出现这个问题,也许可以考虑首先推断架构并将其保存为 json,以便将来读取,您可以使用此架构。这样可以避免手动创建架构时出错。

df.schema.json()

【讨论】:

    【解决方案2】:

    既然您已经在文件中有标头,为什么不让 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)
    

    Databricks 有时无法显示正确的结果。因此,让 Spark 首先推断数据,然后您尝试了解架构的问题,然后采取纠正措施。

    我怀疑您必须将 LongType 用于第一个字段,但请进行比较。附上样本供您参考。由于我不确定实际文件,所以我只是向您指出那个方向。

    【讨论】:

      【解决方案3】:

      我找出了我的数据存在的问题。在我的架构中,我有:

      StructField('Date', DateType()
      

      在 2000 年 3 月 3 日这样的日期值上。您不能在架构中将这种日期强制为 DateType,只能是 13-03-2000。

      这意味着当将架构应用于所有变量时,它们都返回空值,即使只有一个变量失败。

      希望对一些人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-20
        • 2014-12-03
        • 2017-01-16
        • 2019-02-13
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        • 2014-09-25
        相关资源
        最近更新 更多