Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/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
Apache spark 如何从Spark中的文本文件创建dataFame_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何从Spark中的文本文件创建dataFame

Apache spark 如何从Spark中的文本文件创建dataFame,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个HDFS格式的文本文件,格式如下: 002902907099991901010106004+64333+023450FM-12+00001N9-00781+381 00350290709991902010113004+64333+023450FM-12+00001N9-01001+381 我想做的是将前25个字符作为字符串,将前4个数字除以10作为第二个“减号”后的两倍,然后跳过所有其他字符,如: ID | Column --

我有一个HDFS格式的文本文件,格式如下:

002902907099991901010106004
+64333+023450FM-12+00001N9-
0078
1+381

00350290709991902010113004
+64333+023450FM-12+00001N9-
0100
1+381

我想做的是将前25个字符作为字符串,将前4个数字除以10作为第二个“减号”后的两倍,然后跳过所有其他字符,如:

ID                                | Column
----------------------------      | ----
0029029070999991901010106004      | 007.8
0035029070999991902010113004      | 010.0
我该怎么做?谢谢大家

检查下面的代码

scala> df
.withColumn("id",regexp_extract($"value","(^[0-9]{28})",0))
.withColumn("column",(regexp_extract($"value","N9-([0-9]{4})",1)/lit(10.0)).cast("double"))
.select("id","column")
.show(false)

+----------------------------+------+
|id                          |column|
+----------------------------+------+
|0029029070999991901010106004|7.8   |
|0035029070999991902010113004|10.0  |
+----------------------------+------+

可能是您的预期输出错误

00781/10.0=78.1
7.8

01001/10.0=100.1
10.0

scala> val df = spark.read.text("/tmp/data")
df: org.apache.spark.sql.DataFrame = [value: string]

scala> df.show(false)
+--------------------------------------------------------------------------------------------------------------------------------------------+
|value                                                                                                                                       |
+--------------------------------------------------------------------------------------------------------------------------------------------+
|0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999MW1381|
|0035029070999991902010113004+64333+023450FM-12+000599999V0201401N011819999999N0000001N9-01001+99999100311ADDGF104991999999999999999999MW1381|
+--------------------------------------------------------------------------------------------------------------------------------------------+
更新忽略以上内容

如果您只需要4位数字,可以尝试下面的代码

scala> df
.withColumn("id",regexp_extract($"value","(^[0-9]{28})",0))
.withColumn("column",(regexp_extract($"value","N9-([0-9]{4})",1)/lit(10.0)).cast("double"))
.select("id","column")
.show(false)

+----------------------------+------+
|id                          |column|
+----------------------------+------+
|0029029070999991901010106004|7.8   |
|0035029070999991902010113004|10.0  |
+----------------------------+------+


尝试类似这样的操作-
df.withColumn(“id”,regexp\u extract($“value)”,“([0-9]{28})”,0”)。withColumn(“column”,regexp\u extract($“value”,“N9-([0-9]{5})”,1))。选择(“id”,“column”)。显示(false)
&您需要根据您的逻辑修改此项,并对您的编辑进行1次投票,请在问题中从左到右提到4位数字,否则,我们将从右向左考虑&0没有值:)非常感谢。但我所期望的是第二个米恩符号后面有四个数字,而不是五个。我刚刚编辑并突出显示了我想要的数字。不过还是要谢谢你!根据您的编辑更新答案。检查并让我知道它是否不工作:)当我从txt创建df时,我认为有问题。。。。我创建了一个带有id和column的case类'Numbers',然后
val df=spark.sparkContext.textFile(“data.txt”).map(u.split(“/t”)).map(attributes=>Numbers(attributes(0))).toDF()
,然后当我运行代码时,它说“无法解析给定输入列的'value:[id]”…我没有使用任何case类,只需将示例代码作为文本文件加载,并使用上述逻辑即可