CSV到对象数组

时间:2017-04-25 22:20:39

标签: arrays scala csv object apache-spark

我正在使用第三方软件包,它使用了一个“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

Splitting strings in Apache Spark using Scala

How to iterate records spark scala?

2 个答案:

答案 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(",")}

这一切都可以一次完成,我只将它们拆分为显示逻辑步骤→文件→列表字符串→列表列表字符串→列表功能