我正在使用第三方软件包,它使用了一个“PointFeature”对象。我试图获取一个csv文件,并将每行中的元素放入这些PointFeature对象的数组中。
我的实现的PointFeature构造函数如下所示:
Feature(Point( _c1, _c2), _c3)
其中_c1,_c2和_c3是我的csv的列,代表双打。
这是我目前的尝试:
val points: Array[PointFeature[Double]] = for{
line <- sc.textFile("file.csv")
point <- Feature(Point(line._c1,line._c2),line._c3)
} yield point
引用列
时出现我的错误<console>:36: error: value _c1 is not a member of String
point <- Feature(Point(line._c1,line._c2),line._c3.toDouble)
^
<console>:36: error: value _c2 is not a member of String
point <- Feature(Point(line._c1,line._c2),line._c3.toDouble)
^
<console>:36: error: value _c3 is not a member of String
point <- Feature(Point(line._c1,line._c2),line._c3.toDouble)
^
这显然是因为我引用了一个String,好像它是一个DataFrame的元素。我想知道是否有一种方法可以在这种循环格式中使用DataFrames,或者将每一行拆分为双精度列表。也许我需要一个RDD?
另外,我不确定这会产生一个数组。实际上,我怀疑它会返回一个RDD ......
我在Amazon EMR上使用Spark 2.1.0
以下是我从中提取的其他一些问题:
How to read csv file into an Array of arrays in scala
答案 0 :(得分:0)
您可以这样设置Dataset[Feature]
:
case class Feature(x: Double, y: Double, z: Double)
sparkSession.read.csv("file.csv")
.toDF("x", "y", "z")
.withColumn("x", 'x.cast(DoubleType))
.withColumn("y", 'y.cast(DoubleType))
.withColumn("z", 'z.cast(DoubleType))
.as[Feature]
然后,您可以根据需要使用强类型DataSet[Feature]
。
答案 1 :(得分:0)
我建议以较小的步骤进行此操作。
第一步
将您的行作为数组/列表/任何字符串获取。
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(10)
x,y,z = np.random.randn(3,10)
xs, ys, zs = [x[5]], [y[5]], [z[5]]
print xs, ys, zs
y[5] = np.nan
sc = plt.scatter(x,y,c=z,s=36, cmap=plt.cm.jet)
climx, climy = sc.get_clim()
plt.scatter(xs,ys,c=zs,s=121, marker="s", cmap=plt.cm.jet, vmin=climx, vmax=climy )
plt.colorbar()
plt.show()
,或类似的东西。
第二步
将你的行分成他们自己的列列表。
val lines = sc.textFile("file.txt").getLines
第三步
将您的colums提取为可以使用的val
val splits = lines.map {l => l.split(",")}
这一切都可以一次完成,我只将它们拆分为显示逻辑步骤→文件→列表字符串→列表列表字符串→列表功能