Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将字符串列转换为数组_Scala_Apache Spark_Split_Spark Dataframe - Fatal编程技术网

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。在这两种情况下,您都需要加载文件然后保存。好的,那么我如何读取此文件?我的意思是作为一个数据帧,所以我可以执行你的一段代码。。。