【问题标题】:Column name with dot spark带点火花的列名
【发布时间】:2017-11-06 02:43:25
【问题描述】:

我正在尝试从 DataFrame 获取列并将其转换为 RDD[Vector]

问题是我的列名称中有一个“点”作为以下数据集:

"col0.1","col1.2","col2.3","col3.4"
1,2,3,4
10,12,15,3
1,12,10,5

这就是我正在做的:

val df = spark.read.format("csv").options(Map("header" -> "true", "inferSchema" -> "true")).load("C:/Users/mhattabi/Desktop/donnee/test.txt")
val column=df.columns.map(c=>s"`${c}`")
val rows = new VectorAssembler().setInputCols(column).setOutputCol("vs")
  .transform(df)
  .select("vs")
  .rdd
val data =rows.map(_.getAs[org.apache.spark.ml.linalg.Vector](0))
  .map(org.apache.spark.mllib.linalg.Vectors.fromML)

val mat: RowMatrix = new RowMatrix(data)
//// Compute the top 5 singular values and corresponding singular vectors.
val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(mat.numCols().toInt, computeU = true)
val U: RowMatrix = svd.U  // The U factor is a RowMatrix.
val s: Vector = svd.s  // The singular values are stored in a local dense vector.
val V: Matrix = svd.V  // The V factor is a local dense matrix.

println(V)

请帮助我考虑名称中带有点的列。谢谢

【问题讨论】:

  • 您是否尝试更改列名?
  • @RameshMaharjan 它适用于没有点的列,但我需要用点来修复它,任何帮助谢谢
  • 我建议用点保存架构,更改列名,并在完成新列名后用点将其改回。不行吗?

标签: scala apache-spark apache-spark-sql apache-spark-mllib apache-spark-ml


【解决方案1】:

对于 Spark SQL

spark.sql("select * from reg_data where reg_data.`createdResource.type` = 'Berlin'")

【讨论】:

  • 您能否添加一些附加信息,为什么您的帖子会解决问题?请考虑查看How to Answer
  • 这是 spark SQL 的示例
【解决方案2】:

如果您的问题是列名中的.(dot),您可以使用`(backticks) 将列名括起来。

df.select("`col0.1`")

【讨论】:

  • 请注意,drop 函数在没有反引号的情况下表现良好。在这种情况下: df.drop("col0.1")
  • @devilpreet 与 withColumn 一样,“点”名称也可以正常工作。显然,只有在表达式中引用这样的列才需要用反引号转义。
  • 请注意这也有效:df.select("parent_column.`child.column.with.dots.i.dont.want.expanded`")
【解决方案3】:

这里的问题是VectorAssembler 实现,而不是列本身。例如,您可以跳过标题:

val df = spark.read.format("csv")
  .options(Map("inferSchema" -> "true", "comment" -> "\""))
  .load(path)

new VectorAssembler()
  .setInputCols(df.columns)
  .setOutputCol("vs")
  .transform(df)

或在传递给VectorAssembler之前重命名列:

val renamed =  df.toDF(df.columns.map(_.replace(".", "_")): _*)

new VectorAssembler()
  .setInputCols(renamed.columns)
  .setOutputCol("vs")
  .transform(renamed)

最后最好的方法是明确提供模式:

import org.apache.spark.sql.types._

val schema = StructType((0 until 4).map(i => StructField(s"_$i", DoubleType)))

val dfExplicit = spark.read.format("csv")
  .options(Map("header" -> "true"))
  .schema(schema)
  .load(path)

new VectorAssembler()
  .setInputCols(dfExplicit.columns)
  .setOutputCol("vs")
  .transform(dfExplicit)

【讨论】:

  • JIRA 的主题?
  • @zero323 感谢您的帮助,您的意思是在保持相同列名的同时没有其他解决方案可以处理此问题?谢谢
  • 没有,我不知道,但我从来没有集中精力寻找一个。通常,您不应使用[a-zA-Z0-9_] 以外的任何其他内容作为列名,以保持与其他工具(包括 Parquet)的合理兼容性。对于VectorAssembler 来说,这并不重要。
  • 我也无法重命名它——即使我尝试重命名并显示它也失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多