Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
Arrays 如何识别csv文件中的空字段?_Arrays_Scala_Csv_Apache Spark_Mapping - Fatal编程技术网

Arrays 如何识别csv文件中的空字段?

Arrays 如何识别csv文件中的空字段?,arrays,scala,csv,apache-spark,mapping,Arrays,Scala,Csv,Apache Spark,Mapping,我使用的是Spark 2.1.1和Scala 2.11.8 我必须从csv文件中读取数据,该文件的列数从最少6列到最多8列不等。我必须拆分9个条目,一旦拆分,0到5列将始终包含数据。但是,第6列至第8列中可能存在或不存在数据。我使用以下方法将所需列分离并存储在RDD中: val read_file = sc.textFile("Path to input file"); val uid = read_file.map(line => {var arr = line.split(",");

我使用的是Spark 2.1.1和Scala 2.11.8

我必须从csv文件中读取数据,该文件的列数从最少6列到最多8列不等。我必须拆分9个条目,一旦拆分,0到5列将始终包含数据。但是,第6列至第8列中可能存在或不存在数据。我使用以下方法将所需列分离并存储在RDD中:

val read_file = sc.textFile("Path to input file");

val uid = read_file.map(line => {var arr = line.split(","); (arr(2).split(":")(0),arr(3),arr(4).split(":")(0),arr(5).split(":")(0),arr(6).split(":")(0),arr(7).split(":")(0),arr(8).split(":")(0))})
现在,在获得的RDD“uid”中,列0到3将始终被填充,但4到7可能有数据,也可能没有数据。我从中读取数据的csv文件

2017-05-09 21:52:42 , 1494391962 , p69465323_serv80i:10:450 , 7 , fb_406423006398063:396560, guest_861067032060185_android:671051, fb_100000829486587:186589, fb_100007900293502:407374, fb_172395756592775:649795

2017-05-09 21:52:42 , 1494391962 , z67265107_serv77i:4:45 , 2:Re , fb_106996523208498:110066, fb_274049626104849:86632, fb_111857069377742:69348, fb_127277511127344:46246

2017-05-09 21:52:42 , 1494391962 , v73392772_serv33i:9:1400 , 1:4x , c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone:314129, fb_217409795286934:294262
可以看出,第一个条目填充了所有9列,第二个条目填充了8列,第三个条目仅填充了6列

根据获得的RDD,我必须将列arr(1)(0)与列arr(3)(0)映射到arr(7)(0)。列1的映射应该只使用从3到7的填充列。3到7之间的空列不必与列1映射。我尝试使用for循环来完成此操作:

一旦我在执行语句val uid=read_file.map()后得到这个值:

我有:

for(var x(arr(x)!=null){
val pairedRdd=uid.map(x=>((x.'u 1,x.'u 3),(x.'u 1,x.'u 4),(x.'u 1,x.'u 5),(x.'u 1,x.'u 6),(x.'u 1,x.'u 7)))
这适用于给定数据示例中的第一条语句,但不适用于第二条和第三条语句

我承认,这种逻辑是错误的,但它只是传达了我正在尝试做什么的想法


注意:不允许使用Spark SQL。

您可以执行以下操作

val read_file = sc.textFile("Path to input file")
val uid = read_file.map(line => line.split(",")).map(array => array.map(arr => {
    if(arr.contains(":")) (array(2).split(":")(0), arr.split(":")(0))
    else (array(2).split(":")(0), arr)
}))
现在做

uid.map(array => array.drop(2)).map(array => array.toSeq)
将为您提供
rdd
as

WrappedArray(( p69465323_serv80i, p69465323_serv80i), ( p69465323_serv80i, 7 ), ( p69465323_serv80i, fb_406423006398063), ( p69465323_serv80i, guest_861067032060185_android), ( p69465323_serv80i, fb_100000829486587), ( p69465323_serv80i, fb_100007900293502), ( p69465323_serv80i, fb_172395756592775))
WrappedArray(( z67265107_serv77i, z67265107_serv77i), ( z67265107_serv77i, 2), ( z67265107_serv77i, fb_106996523208498), ( z67265107_serv77i, fb_274049626104849), ( z67265107_serv77i, fb_111857069377742), ( z67265107_serv77i, fb_127277511127344))
WrappedArray(( v73392772_serv33i, v73392772_serv33i), ( v73392772_serv33i, 1), ( v73392772_serv33i, c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone), ( v73392772_serv33i, fb_217409795286934))
鉴于

uid.map(array => array.drop(2)).flatMap(array => array)
将为您提供
rdd
as

( p69465323_serv80i, p69465323_serv80i)
( p69465323_serv80i, 7 )
( p69465323_serv80i, fb_406423006398063)
( p69465323_serv80i, guest_861067032060185_android)
( p69465323_serv80i, fb_100000829486587)
( p69465323_serv80i, fb_100007900293502)
( p69465323_serv80i, fb_172395756592775)
( z67265107_serv77i, z67265107_serv77i)
( z67265107_serv77i, 2)
( z67265107_serv77i, fb_106996523208498)
( z67265107_serv77i, fb_274049626104849)
( z67265107_serv77i, fb_111857069377742)
( z67265107_serv77i, fb_127277511127344)
( v73392772_serv33i, v73392772_serv33i)
( v73392772_serv33i, 1)
( v73392772_serv33i, c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone)
( v73392772_serv33i, fb_217409795286934)

选择权归你

缺少的列,是否按顺序排列?我的意思是,比如说,缺少一列时,列号是第7列,对吗?正确。缺少的列将始终按顺序排列。你有9列。你能检查你的问题吗?更新不正确的信息吗?完成。我已经提到,第二行I中的列从0开始t self.Columns来自0-8。所需输出的示例也应该有帮助:)这与我要查找的非常接近,但上面提到的uid.first()语句的输出是我要对其执行操作的RDD,即uid RDD的第一列映射到第4列到第7列,前提是它们不为null。必须跳过空列。此外,必须对超过5000万个条目执行此映射,每个条目中的列数各不相同。这就是我尝试使用循环机制的原因。所以你只想要有9个字段的输出,对吗?不,不,我在UID RDD中得到的输出,第3列和第4列将始终被填充。第5列到第7列可以是填充的,也可以是空的。我必须用3-7中的尽可能多的列来映射第一列,比如说,如果只填充了第3,4,5列,我必须将第1列映射到第3,4,5列。如果列3,4,5,6,7被填充,我必须将列1映射为3,4,5,6,7,依此类推。我必须检查每个条目中从5到7的空列。如果为null,则不映射到第1列。如果不为null,则映射到第1列。但是不能省略任何条目,所有条目都必须映射。我希望这能传达我想要做的:)这意味着如果5到7为空,那么每5到7得到(数组(1),数组(1)),是这样吗?假设我得到(“p”,“7”,“fb1”,“fb2”,“fb3”,“fb4”,“fb5”)。现在第3列到第7列不是空的,所以我映射了第(1,3)列;(1,4);(1,5);(1,6);(1,7). 但如果列5,6,7为空,则I映射(1,3);(1,4). 如果第7列为空,则I映射(1,3);(1,4);(1,5);(1,6)等等。
uid.map(array => array.drop(2)).flatMap(array => array)
( p69465323_serv80i, p69465323_serv80i)
( p69465323_serv80i, 7 )
( p69465323_serv80i, fb_406423006398063)
( p69465323_serv80i, guest_861067032060185_android)
( p69465323_serv80i, fb_100000829486587)
( p69465323_serv80i, fb_100007900293502)
( p69465323_serv80i, fb_172395756592775)
( z67265107_serv77i, z67265107_serv77i)
( z67265107_serv77i, 2)
( z67265107_serv77i, fb_106996523208498)
( z67265107_serv77i, fb_274049626104849)
( z67265107_serv77i, fb_111857069377742)
( z67265107_serv77i, fb_127277511127344)
( v73392772_serv33i, v73392772_serv33i)
( v73392772_serv33i, 1)
( v73392772_serv33i, c2eb11fd-99dc-4dee-a75c-bc9bfd2e0ae4iphone)
( v73392772_serv33i, fb_217409795286934)