【问题标题】:Issue with displaying results in the loop after collect()在 collect() 之后在循环中显示结果的问题
【发布时间】:2022-07-06 17:51:58
【问题描述】:

有什么问题?

我在显示从文本文件中读取的数据时遇到问题。该文件 (yields.txt) 有 3 行,看起来也正在读取第四行,其中包含一些奇怪的内容。

文件

文件编码:UTF-8 -> 我也检查 ASCII 但同样的问题 EOL: Unix(LF) -> 我也检查 Windows (CRLF) 但同样的问题

1 -0.0873962663951055 0.0194176287820278 -0.0097985244947938 -0.0457230361016478 -0.0912513154921251 0.0448220622524235
2 0.049279031957286 0.069222988721009 0.0428232461362216 0.0720027150750844 -0.0209348305073702 -0.0641023433269808
3 0.0770763924363555 -0.0790020383071036 -0.0601622344182963 -0.0207625817307966 -0.0193570710130222 -0.0959349375686872

错误说明

从控制台登录

在映射器中 return Row(ID=int(fields[0]),asset_1 = float(fields[1]),asset_2 = float(fields[2]),asset_3 = float(fields3),asset_4 = float(fields[4 ]),asset_5 = float(fields[5]),asset_6 = float(fields[6])) ValueError: int() 以 10 为底的无效文字:b'PK\x03\x04\x14\x00\x00\x00\x08\x00AW\xef\xbf\xbdT\xef\xbf\xbdu\xef\xbf\xbdDZ\ xef\xbf\xbd\x1e\x03i\x18\xef\xbf\xbd\x07'

我也试图找出此内容中的内容

这是一些奇怪的数据,根本没有出现在我用下面显示的脚本检查的文本文件中:

import os

DATA_FOLDER_PATHNAME = 
'\\'.join(os.path.dirname(__file__).split('\\') 
[:-1])+'\\'+'data'+'\\'+'yields.txt'

with open(DATA_FOLDER_PATHNAME, 'r', encoding='ansi') as f:
    print(f.read())

您可以看到一个空行可见,但我不知道如何改进我的代码以避免此错误。

代码

import findspark
import os
findspark.init(PATH_TO_SPARK)

from pyspark.sql import SparkSession
from pyspark.sql import Row

DATA_FOLDER_PATHNAME = '\\'.join(os.path.dirname(__file__).split('\\')[:-1])+'\\'+'data' # location of data file

def mapper(line):
    fields = line.split()
    return Row(ID=int(fields[0]),asset_1 = float(fields[1]), asset_2 = float(fields[2]), asset_3 = float(fields[3]),asset_4 = float(fields[4]), asset_5 = float(fields[5]), asset_6 = float(fields[6]))

spark = SparkSession.builder.appName("SparkSQL").getOrCreate()
lines = spark.sparkContext.textFile(DATA_FOLDER_PATHNAME, minPartitions = 2000, use_unicode = False) 
assets_with_yields_rdd = lines.map(mapper)
assets_with_yields_df = spark.createDataFrame(assets_with_yields_rdd).cache()
assets_with_yields_df.createOrReplaceTempView('assets_with_yields_view')

assets_with_yields_view_df = spark.sql('select * from assets_with_yields_view')

print(80*'-')
for asset in assets_with_yields_view_df.collect():
    print(asset)
print(80*'-')
spark.stop()

问题

有谁知道什么会导致这种奇怪的问题?

【问题讨论】:

  • 你能提供一个数据样本吗?我的建议是首先使用更简单的框架(如 pandas)读取数据,甚至只是“手动”解析文件以查看根本原因是什么。还要检查 .txt 文件编码。我还建议使用 .read 函数读取数据并根据需要指定 .options() 。这里link 到文档。希望对你有帮助

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

解决方案

原因是我在一个文件夹中有几个文件,它会依次读取它们,所以存在一些差异。

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2020-08-15
    • 2017-04-30
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多