以下のコードは次のようになります。
- 文字列のシーケンスを反復処理する
- それぞれをjsonとして解析し、
- ほとんどの言語で識別子として使用できない名前のフィールドを除外します
- 残りの名前を小文字にする
- 結果を文字列としてシリアライズする
小規模なテストでは期待どおりに動作しますが、ライブ データの 860 万アイテム シーケンスでは、出力シーケンスが入力シーケンスよりも大幅に長くなります。
import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.apache.spark._
val txt = sc.textFile("s3n://...")
val patt="""^[a-zA-Z]\w*$""".r.findFirstIn _
val json = (for {
line <- txt
JObject(children) <- parse(line)
children2 = (for {
JField(name, value) <- children
// filter fields with invalid names
// patt(name) returns Option[String]
_ <- patt(name)
} yield JField(name.toLowerCase, value))
} yield compact(render(JObject(children2))))
実際にユニークアイテムの数が増えることを確認したので、アイテムを複製するだけではありません。Scala 内包表記と json4s についての私の理解を考えると、これがどのように可能かわかりません。大規模なライブ データ コレクションは Spark RDD ですが、私のテストでは通常の Scala Seq を使用しましたが、違いはありません。
上記のコードjson
よりも多くの要素をどのように持つことができますか?txt