【问题标题】:Transforming RDD[String] to RDD[myclass]将 RDD[String] 转换为 RDD[myclass]
【发布时间】:2021-02-26 00:08:42
【问题描述】:

我正在尝试将 RDD[String] 转换为 RDD[Picture] 但无法做到。如果我能设法将 RDD 转换为 RDD[图片],我将使用 def hasValidCountry 检查图片元的纬度和经度值是否有效。之后,我尝试使用图片类中的 def hasTags 检查用户标签是否有效。我遇到的问题:

  1. 发现隐式转换:row ⇒ augmentString(row): scala.collection.immutable.StringOps
  2. 类型不匹配;发现:需要字符串:数组[字符串]
  3. value InterestingPics 不是 Array[Nothing] 的成员可能的原因:可能在 `value InterestingPics' 之前缺少分号?

我的意图是选择具有有效国家和标签的线路并将所有线路转换为新的 RDD[图片] 类。

ScalaFile1(我已经更新了 ScalaFile):

  object Part2 {
      def main(args: Array[String]): Unit = {
        var spark: SparkSession = null
        try {
          spark = SparkSession.builder().appName("Flickr using dataframes").config("spark.master", "local[*]").getOrCreate()
          val originalFlickrMeta: RDD[String] = spark.sparkContext.textFile("flickrSample.txt")        
          
      val InterestingPics = originalFlickrMeta.map(row => row.split('\t')).map(field => Picture(field(0).toString())
      InterestingPics.collect
      InterestingPics.take(5).foreach(println)

【问题讨论】:

  • 如果您遵循以下准则,人们会发现回答您的问题会容易得多:stackoverflow.com/help/minimal-reproducible-example。您的示例在语法上不正确(例如,您缺少 3 个右大括号),因此您的示例会产生语法错误,而不是您在帖子中提到的错误。即使存在语法问题,您的 IDE 也可能会突出显示其他一些错误,但是当语法问题影响范围(例如缺少大括号)时,这不是很可靠,因此您真的想先修复语法。

标签: scala apache-spark rdd


【解决方案1】:

这是一个例子:

case class case_for_rdd(c1: Int, c2: String, c3: String)

val rdd_data = spark.sparkContext.textFile("/FileStore/tables/csv01-4.txt")
val rdd = rdd_data.map(row => row.split(',')).map(field => case_for_rdd(field(0).toInt, field(1), field(2)))
rdd.collect

从带有数组的文件中读取 RDD 的更复杂的示例。数组需要一个分隔符。

1,10,100,aa|bb|cc
2,20,200,xxxxxx|yyyyyyyy|z|aaa

一些示例代码,但使用 List 否则你会看到array addresses,这就是那些奇怪的字符串,由 smarter 提供 这里的人:

case class case_for_rdd(c1: Int, c2: String, c3: String, a4: List[String])  
val rdd_data = spark.sparkContext.textFile("/FileStore/tables/csv03.txt")
val myCaseRdd = rdd_data.map(row => row.split(',')).map(field => case_for_rdd(field(0).toInt, field(1), field(2), (field(3).split("\\|").toList)))
myCaseRdd.collect

我的建议是使用 DF,这样拆分的东西就更容易了。此外,通过转换对rdd 进行操作,然后case class 就会丢失。带有 DF api 的数组没有这样的问题。

【讨论】:

  • 感谢您的回答。但是我不明白的一件事是,我的案例类 Picture 有 4 'val' which(lat: double, long: double , c Country, userTags: Array[String]。我是如何使用输入 c1: Int, c2 :字符串,c3:RDD本身的字符串?另外,我如何在case类中使用两个def,它返回布尔值并检查纬度和经度。
  • 一个 rdd of string 表示所有 i 字符串。然后你需要像我在 c1, field(0) 上展示的那样进行类型转换。
  • 我已根据您的代码更新了问题。但是得到了indexoutofboundexception。 RDD 字符串根据 Picture 类中定义的字段映射,我们在 map 函数中应用。无法了解如何根据我需要的值创建 RDD; lat、long、Country 等。因为主要的 RDD 有 n 个元素,但我的意图 RDD 将有 m 个元素,其中 n>m。在这种情况下,spark 如何理解基础 RDD 中的哪个字段将转换为图片类的 RDD。我真的很困惑?
  • 试图从文件中读取一系列数据? Vsraible 还是固定数量?显示输入的 sn-p。
  • 我分享了一个数据的 sn-p。我的意思是读取行,用','分隔行并将每个元素写入Array [String]。但还是不行。
【解决方案2】:

在@thebluephantom 的帮助下,我有一个问题的解决方案。非常感谢。

val InterestingPics = originalFlickrMeta.map(line => (new Picture(line.split("\t")))).filter(f => f.c != null && f.userTags.length > 0)
      InterestingPics.collect().foreach(println)

【讨论】:

  • 如果是这样,那么您可以投票,但最后我认为可能是翻译丢失的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多