【发布时间】: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