将字符串列转换为Array

时间:2017-10-19 08:13:05

标签: scala apache-spark split spark-dataframe

我有以下数据,我希望以稍后可以查询的方式拆分流派值。作为第一步,我知道如何分割列,但问题是当我应用分割时我只得到一个类型值而不是所有类型列

id,genre,rating
1,"lorem_1, lorem_2, lorem_3",5
1,"lorem_1, lorem_2, lorem_3, lorem_4, lorem_5",5
1,"lorem_1, lorem_2, lorem_3, lorem_4",5
1,"lorem_1, lorem_2, lorem_3, lorem_4, lorem_5",5
...

首选结果

id,genre,rating
1,[lorem_1, lorem_2, lorem_3],5
1,[lorem_1, lorem_2, lorem_3, lorem_4, lorem_5],5
...

或任何其他易于查询的结果

3 个答案:

答案 0 :(得分:1)

假设数据类型为 'id,genre,rating'是List [(Int,String,Int)]

$ node
> let f = (x)=>{x+1}
undefined
> f(3)
undefined
> let f = (x)=>{return x+1}
undefined
> f(3)
4

以上可以通过以下方式转换为所需的方式

(val, i) => {return {i:val}}

答案 1 :(得分:1)

最简单的方法是使用DataFrame API的split函数:

val df2 = df.withColumn("genre", split($"genre", ", "))

由于您有一个csv文件,因此可以将数据读取为数据帧:

val spark = SparkSession.builder.getOrCreate()
val df = spark.read
  .format("csv")
  .option("header", "true") //reading the headers
  .load("/path/to/csv")

加载后,可以按上述方法拆分genre列。 如果您想在之后保存为csv文件,则可以使用以下命令:

df.write.format("csv").save("/path/to/save/csv")

Spark 2.x 约定用于加载和保存到csv。较旧的版本依赖于spark-csv包,但它包含在较新版本的Spark中。

答案 2 :(得分:1)

我猜你有一个文本文件,其中包含问题中提供的信息。我可以建议您采用以下两种方式:1)使用dataframesplit以及2)使用rddsplit

1)dataframe方式

import org.apache.spark.sql.functions._
val df = sqlContext
  .read
  .format("com.databricks.spark.csv")
  .option("header", true)
  .csv("path to your csv file")
  .withColumn("genre", split($"genre", ","))

您应该有以下输出

+---+-------------------------------------------------+------+
|id |genre                                            |rating|
+---+-------------------------------------------------+------+
|1  |[lorem_1,  lorem_2,  lorem_3]                    |5     |
|1  |[lorem_1,  lorem_2,  lorem_3,  lorem_4,  lorem_5]|5     |
|1  |[lorem_1,  lorem_2,  lorem_3,  lorem_4]          |5     |
|1  |[lorem_1,  lorem_2,  lorem_3,  lorem_4,  lorem_5]|5     |
+---+-------------------------------------------------+------+

2)rdd方式

val rdd = sc
  .textFile("path to your csv file")
  .map(x => x.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)"))
  .map(x => (x(0), x(1).split(","), x(2)))

你应该有以下输出

(id,[genre],rating)
(1,[lorem_1,  lorem_2,  lorem_3],5)
(1,[lorem_1,  lorem_2,  lorem_3,  lorem_4,  lorem_5],5)
(1,[lorem_1,  lorem_2,  lorem_3,  lorem_4],5)
(1,[lorem_1,  lorem_2,  lorem_3,  lorem_4,  lorem_5],5)

我希望答案很有帮助