Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 - Fatal编程技术网

Scala 选择具有不同分离模式的值

Scala 选择具有不同分离模式的值,scala,apache-spark,Scala,Apache Spark,我有一个包含几个元素的文件。从Spark Scala中,我只想选择其中一个值。但它们的分离形式因价值观的不同而不同。 我的档案如下: "test, 27.08.2020.14.56.30, mary, products=[Product{id=123, origin=in}]" "test, 27.08.2020.14.58.50, ane, products=[Product{id=1245, origin=on}]" 目的是获得此类表格 class

我有一个包含几个元素的文件。从Spark Scala中,我只想选择其中一个值。但它们的分离形式因价值观的不同而不同。 我的档案如下:

"test, 27.08.2020.14.56.30, mary, products=[Product{id=123, origin=in}]"
"test, 27.08.2020.14.58.50, ane, products=[Product{id=1245, origin=on}]"
目的是获得此类表格

class             date              name       id
 test     27.08.2020.14.56.30       mary      123
 test     27.08.2020.14.58.50       ane       1245
我想在同一行上连接属性,然后将该标题关联起来,并用这些值打印一个表

val file= sc.textFile("C:\Users\test.txt")
val name = file.map(_.split(",")).map{x => (x(0),x(1),x(2))}
val id = file.map(_.split("=")).map{x => (x(3))}
val all = name.union(id).collect
val newNames = Seq("class","date","name","id")
val df = all.toDF(newNames: _*)
df.show()

但是,作为最后一个元素,我只想选择值为“123”的“id”,考虑到分隔不同,我也不知道如何选择该数字。当我收集元素的时候,它给了我错误。我如何选择这些元素并将它们连接起来,以便以后与标题关联?

也许我不理解您的问题,但您尝试过这个吗

val tstSeq = spark.sparkContext.textFile("/user/admin/tst.txt")

val all = tstSeq.map(_.split(",")).map{x => (x(0),x(1),x(2), x(3).split("=")(2))}

val newNames = Seq("class","date","name","id")
val df = all.toDF(newNames: _*)

df.show
其输出为:

+-----+--------------------+-----+----+
|class|                date| name|  id|
+-----+--------------------+-----+----+
| test| 27.08.2020.14.56.30| mary| 123|
| test| 27.08.2020.14.58.50|  ane|1245|
+-----+--------------------+-----+----+
或:

要获得此输出,请执行以下操作:

+-----+--------------------+-----+----+------+
|class|date                |name |id  |origin|
+-----+--------------------+-----+----+------+
|test | 27.08.2020.14.56.30| mary|123 |in    |
|test | 27.08.2020.14.58.50| ane |1245|on    |
+-----+--------------------+-----+----+------+

你的想法是正确的,这正是我想要的。我想提出第二个建议,以获得其他值。如果你只是替换它的工作,但它会得到所有的值在一行,我只是想“123”。为此,我按照建议进行了拆分,但它给出了错误:
error Executor:Exception in task 0.0 in stage 37.0(TID 2009)java.lang.ArrayIndexOutOfBoundsException:4
,这是因为您的行没有完全相同的模式:(,如果你能发送一个更大的快照,我将帮助你我有这个输入
2020-08-28 05:16:10,teste,123,user.admin.novo.info.rules
。我想得到日期、名称、id和只显示“rules”的信息,并将其发送到一个新文件。我只能选择“rules”一词,但没有其他元素,我想同时打印所有四个元素,这是我的错误:错误执行者:第37.0阶段任务0.0中的异常(TID 2009)java.lang.ArrayIndexOutOfBoundsException:4在$line130处。$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$2。应用(:26)…警告TaskSetManager:在阶段37.0中丢失任务0.0(TID 2009,本地主机,执行器驱动程序):java.lang.ArrayIndexOutOfBoundsException:4位于$line130。$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$2。应用(:26)…这是您输入中仅有的两种行样式?2020-08-28 05:16:10,teste,123,user.admin.novo.info.rules.test,27.08.2020.14.56.30,mary,products=[Product{id=123,origin=in}如果是,在本例中,您可以使用正则表达式模式来处理这两种格式
+-----+--------------------+-----+----+------+
|class|date                |name |id  |origin|
+-----+--------------------+-----+----+------+
|test | 27.08.2020.14.56.30| mary|123 |in    |
|test | 27.08.2020.14.58.50| ane |1245|on    |
+-----+--------------------+-----+----+------+