Scala 将字符串列转换为数组
我有以下数据,我想以一种可以在以后查询的方式拆分流派值。作为第一步,我知道如何分割列,但问题是当我应用分割时,我只得到一个类型值,而不是每个类型列的所有值Scala 将字符串列转换为数组,scala,apache-spark,split,spark-dataframe,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, lor
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
...
或任何其他易于查询的结果假设数据类型为
“id、流派、评级”是列表[(Int、String、Int)]
可以通过以下方式将上述内容转换为所需的方式
val b = a.map(x=>(x._1,x._2.split(","),x._3)) // datatype of b is List[(Int,Array[String],Int)]
假设数据类型为
“id、流派、评级”是列表[(Int、String、Int)]
可以通过以下方式将上述内容转换为所需的方式
val b = a.map(x=>(x._1,x._2.split(","),x._3)) // datatype of b is List[(Int,Array[String],Int)]
最简单的方法是使用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")
加载后,可以如上所述拆分流派
列。
如果以后要另存为csv文件,则可以使用以下命令:
df.write.format("csv").save("/path/to/save/csv")
Spark 2.x惯例用于加载和保存到csv。较旧版本依赖于spark csv软件包,但它包含在较新版本的spark中。最简单的方法是使用DataFrame API的
拆分功能:
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")
加载后,可以如上所述拆分流派
列。
如果以后要另存为csv文件,则可以使用以下命令:
df.write.format("csv").save("/path/to/save/csv")
Spark 2.x惯例用于加载和保存到csv。旧版本依赖于spark csv
软件包,但它包含在新版本的spark中。我猜您有一个包含问题中提供的信息的文本文件。我可以推荐两种方法:1)使用dataframe
和split
和2)使用rdd
和split
1) dataframe
way
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", ","))
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 |
+---+-------------------------------------------------+------+
(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
way
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", ","))
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 |
+---+-------------------------------------------------+------+
(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)
我希望答案是有帮助的我想你有一个文本文件,里面有问题中提供的信息。我可以推荐两种方法:1)使用dataframe
和split
和2)使用rdd
和split
1) dataframe
way
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", ","))
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 |
+---+-------------------------------------------------+------+
(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
way
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", ","))
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 |
+---+-------------------------------------------------+------+
(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)
我希望答案是有帮助的当数据是本机格式时,是否可以拆分流派?@geek tech你说的本机格式是什么意思?它在csv文件中吗?我假设数据是在一个数据框中,因为你有apache spark
标记。我刚从一个.csv文件(这就是我所说的本机格式)中得到它,因为它是我想要实现提到的结果…@geek tech,我明白了,你想用apache spark来实现这一点,然后,您可以将数据作为数据帧加载,然后在转换后保存它。另一种选择是使用纯Scala。在这两种情况下,您都需要加载文件然后保存。好的,那么我如何读取此文件?我的意思是作为一个数据帧,所以我可以给你执行一段代码…当数据是本机格式时,有可能分割流派吗?@geek tech你说的本机格式是什么意思?它在csv文件中吗?我假设数据是在一个数据框中,因为你有apache spark
标记。我刚从一个.csv文件(这就是我所说的本机格式)中得到它,因为它是我想要实现提到的结果…@geek tech,我明白了,你想用apache spark来实现这一点,然后,您可以将数据作为数据帧加载,然后在转换后保存它。另一种选择是使用纯Scala。在这两种情况下,您都需要加载文件然后保存。好的,那么我如何读取此文件?我的意思是作为一个数据帧,所以我可以执行你的一段代码。。。