如何读取要在pyspark MLlib中使用的csv?

问题描述 投票:0回答:3

我有一个csv文件,我试图将其用作pyspark中KMeans算法的输入。我正在使用MLlib文档中的代码。

from pyspark.ml.clustering import KMeans
from pyspark.ml.evaluation import ClusteringEvaluator

# Loads data.
dataset = spark.read.format("libsvm").load("P.txt")

# Trains a k-means model.
kmeans = KMeans().setK(2).setSeed(1)
model = kmeans.fit(dataset)

# Make predictions
predictions = model.transform(dataset)

# Evaluate clustering by computing Silhouette score
evaluator = ClusteringEvaluator()

silhouette = evaluator.evaluate(predictions)
print("Silhouette with squared euclidean distance = " + str(silhouette))

# Shows the result.
centers = model.clusterCenters()
print("Cluster Centers: ")
for center in centers:
    print(center) 

我收到错误:

java.lang.NumberFormatException: For input string: "-6.71,-1.14"

我尝试将文件读取为

dataset = spark.read.format("csv").load("P.txt")

但出现另一个错误:

java.lang.IllegalArgumentException: Field "features" does not exist. Available fields: _c0, _c1

我是pyspark的初学者,我试图寻找有关该主题的教程,但没有找到任何教程。

apache-spark pyspark apache-spark-mllib
3个回答
0
投票

检查此读取CSV文件的方法:

df = spark.read.options(header=True).csv('csvFile.csv')

df.show()

0
投票

我发现了问题。正如错误kmeans.fit所指示的,java.lang.IllegalArgumentException: Field "features" does not exist. Available fields: _c0, _c1的DataFrame输入需要具有一个“功能”字段。

为此,我们需要一个VectorAssembler,但是在需要将列转换为数字类型之前,否则会出现错误java.lang.IllegalArgumentException: Data type string of column _c0 is not supported

from pyspark.sql.functions import col

df = spark.read.csv('P.txt')
# Convert columns to float
df = df.select(*(col(c).cast("float").alias(c) for c in df.columns))

assembler = VectorAssembler(
    inputCols=["_c0", "_c1"],
    outputCol="features")

df = assembler.transform(df)
df = df.drop("_c0")
df = df.drop("_c1")
df.show()

-1
投票

Available fields: _c0, _c1

检查数据文件的第一行。很有可能在创建时将headers=True参数保存到hdfs时未使用。

© www.soinside.com 2019 - 2024. All rights reserved.