rhadoop self defined inputformat/outputformat

本文详细介绍使用Hadoop进行大数据处理的方法和技术,包括数据输入输出格式的定义、MapReduce编程模型的应用,以及如何通过HDFS进行文件操作等核心内容。特别针对CSV、TSV和FWF等常见数据格式进行了处理实例演示。
# Copyright 2013 Revolution Analytics
#    
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#      http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# partly from community contributed examples (with code)
# additional copyrights may apply


library(rmr2)
## @knitr getting-data.IO.formats
rmr2:::IO.formats
## @knitr getting-data.make.input.format.csv
make.input.format("csv")
## @knitr getting-data.make.output.format.csv
make.output.format("csv")
## @knitr getting-data.generic.list
my.data = list(TRUE, list("nested list", 7.2), seq(1:3), letters[1:4], matrix(1:25, nrow = 5,ncol = 5))
## @knitr getting-data.to.dfs
hdfs.data = to.dfs(my.data)
## @knitr getting-data.object.length.frequency
result = mapreduce(
  input = hdfs.data,
  map = function(k, v) keyval(lapply(v, length), 1),
  reduce = function(k, vv) keyval(k, sum(vv)))


from.dfs(result)
## @knitr end
## @knitr getting-data.tsv.reader
tsv.reader = function(con){
  lines = readLines(con, 1000)
  if(length(lines) == 0)
    NULL
  else {
    delim = strsplit(lines, split = "\t")
    keyval(
      sapply(delim, 
             function(x) x[1]), 
      sapply(delim, 
             function(x) x[-1]))}} 
## first column is the key, note that column indexes moved by 1
## @knitr getting-data.tsv.input.format
tsv.format = 
  make.input.format(
    format = tsv.reader,
    mode = "text")
## @knitr getting-data.generate.tsv.data


tsv.data = 
  to.dfs(
    data.frame(
      x = 1:100, 
      y = rnorm(100), 
      z = runif(100), 
      w = 1:100), 
    format = 
      make.output.format("csv", sep = "\t"))
## @knitr getting-data.frequency.count
freq.counts = 
  mapreduce(
    input = tsv.data,
    input.format = tsv.format,
    map = function(k, v) keyval(v[1,], 1),
    reduce = function(k, vv) keyval(k, sum(vv)))
## @knitr getting-data.named.columns
tsv.reader = 
  function(con){
    lines = readLines(con, 1000)
    if(length(lines) == 0)
      NULL
    else {
      delim = strsplit(lines, split = "\t")
      keyval(
        sapply(delim, function(x) x[1]), 
        data.frame(
          location = sapply(delim, function(x) x[2]),
          name = sapply(delim, function(x) x[3]),
          value = sapply(delim, function(x) x[4])))}}


## @knitr getting-data.tsv.input.format.1
tsv.format = 
  make.input.format(
    format = tsv.reader,
    mode = "text")
## @knitr getting-data.named.column.access
freq.counts = 
  mapreduce(
    input = tsv.data,
    input.format = tsv.format,
    map = 
      function(k, v) { 
        filter = (v$name == "blarg")
        keyval(k[filter], log(as.numeric(v$value[filter])))},
    reduce = function(k, vv) keyval(k, mean(vv)))                      
## @knitr getting-data.csv.output
csv.writer = function(kv, con){
  cat(
    paste(
      apply(cbind(1:32, mtcars), 
            1, 
            paste, collapse = ","), 
      collapse = "\n"),
    file = con)}
## @knitr getting-data.csv.output.simpler
csv.format = make.output.format("csv", sep = ",")
## @knitr getting-data.explicit.output.arg
mapreduce(
  input = hdfs.data,
  output = tempfile(),
  output.format = csv.format,
  map = function(k, v){
    # complicated function here
    keyval(1, v)},
  reduce = function(k, vv) {
    #complicated function here
    keyval(k, vv[[1]])})
## @knitr getting-data.create.fields.list
fields <- rmr2:::qw(mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb) 
field.size = 8
## @knitr getting-data.fwf.reader
fwf.reader <- function(con) {  
  lines <- readLines(con, 1000)  
  if (length(lines) == 0) {
    NULL}
  else {
    split.lines = unlist(strsplit(lines, ""))
    df = 
      as.data.frame(
        matrix(
          sapply(
            split(
              split.lines, 
              ceiling(1:length(split.lines)/field.size)), 
            paste, collapse = ""), 
          ncol = length(fields), byrow = TRUE))
    names(df) = fields
    keyval(NULL, df)}} 
fwf.input.format = make.input.format(mode = "text", format = fwf.reader)
## @knitr getting-data.fwf.writer
fwf.writer <- function(kv, con) {
  ser = 
    function(df) 
      paste(
          apply(
            df,
            1, 
            function(x) 
              paste(
                format(
                  x, 
                  width = field.size), 
                collapse = "")), 
          collapse = "\n")
  out = ser(values(kv))
  writeLines(out, con = con)}
fwf.output.format = make.output.format(mode = "text", format = fwf.writer)
## @knitr getting-data.generate.fwf.data
fwf.data <- to.dfs(mtcars, format = fwf.output.format)
## @knitr getting-data.from.dfs.one.line
out <- from.dfs(mapreduce(input = fwf.data,
                          input.format = fwf.input.format))
out$val
## @knitr getting-data.cyl.frequency.count
out <- from.dfs(mapreduce(input = fwf.data,
                          input.format = fwf.input.format,
                          map = function(key, value) keyval(value[,"cyl"], 1),
                          reduce = function(key, value) keyval(key, sum(unlist(value))),
                          combine = TRUE))
df <- data.frame(out$key, out$val)
names(df) <- c("cyl","count")
df
## @knitr end


user_defined/4632566641780093882/202407/20240701200842588_42eb2a28_CAMERA_21001003269.jpg user_defined/4632566641780093882/202407/20240701184101127_42eb2a28_CAMERA_21001003290.jpg user_defined/4632566641780093882/202407/20240701181213838_49b0ba1d_CAMERA_21001003266.jpg {"jigsaw":{"stitching_info_version":0,"pic_data":[{"key":1743509164147,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200558845_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200558845_1283224b_clobotics.jpg"]},{"key":1743509172985,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200612270_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200612270_1283224b_clobotics.jpg"]},{"key":1743509187567,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200626816_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200626816_1283224b_clobotics.jpg"]},{"key":1743509216844,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200656053_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200656053_1283224b_clobotics.jpg"]},{"key":1743509238425,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200717796_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200717796_1283224b_clobotics.jpg"]},{"key":1743509281359,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200800661_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200800661_1283224b_clobotics.jpg"]},{"key":1743509296622,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200815948_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200815948_1283224b_clobotics.jpg"]},{"key":1743509308833,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200828315_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200828315_1283224b_clobotics.jpg"]},{"key":1743509327706,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401200847063_1283224b_clobotics.jpg\":{\"lat\":32.392269134521484,\"lon\":119.39070892333984}}}","pic_path":["user_defined/6127943778677458155/202504/20250401200847063_1283224b_clobotics.jpg"]}]},"scene_code":"0","field_code":"slfdf_2503170004","reason_id":"8815788586036214869","reason_name":"定位不准确","location_add":"江苏省扬州市邗江区邗江中路大润发(邗江店)","location_lat":"32.392269134521484","location_lon":"119.39070892333984","sign_distance":63,"store_distance":131,"offset_distance":"当前位置距离签到位置偏差63米,距离门店位置偏差131米","image_path":["user_defined/6127943778677458155/202504/20250401200558845_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200612270_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200626816_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200656053_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200717796_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200800661_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200815948_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200828315_1283224b_clobotics.jpg","user_defined/6127943778677458155/202504/20250401200847063_1283224b_clobotics.jpg"]} {"single":["user_defined/6127943778677458155/202504/15980FB2-9F54-47A5-9C76-A62023714A65.jpg","user_defined/6127943778677458155/202504/D9233360-8766-4CA7-A2D1-587BF18FEBC7.jpg","user_defined/6127943778677458155/202504/263C981F-FD4D-492E-9189-8D9B3759D11A.jpg","user_defined/6127943778677458155/202504/18ACA298-717B-4AF4-9AAE-D51027C4E3C9.jpg","user_defined/6127943778677458155/202504/2A5EB22A-160B-4EC6-8EDA-C0870FD1BD6E.jpg","user_defined/6127943778677458155/202504/96397D2F-9EA6-4317-87AB-C799F0723570.jpg","user_defined/6127943778677458155/202504/D15AD384-FE5E-40E9-BF05-5113D4E91CCF.jpg","user_defined/6127943778677458155/202504/87E95DE1-DBAC-46DB-9B88-806639F7D220.jpg","user_defined/6127943778677458155/202504/677A21B7-5DE3-4C86-B43A-B783F2379F30.jpg","user_defined/6127943778677458155/202504/AF7973C1-88C9-4C42-B634-69635EA4A7DD.jpg","user_defined/6127943778677458155/202504/EC4EAC53-2DBB-4D61-AA23-B8A70FE48D51.jpg","user_defined/6127943778677458155/202504/2348A062-3F15-4473-9EA7-732D33978F8E.jpg","user_defined/6127943778677458155/202504/04DB8C0D-4B45-42D5-9FC0-F652F6C1A8E7.jpg"],"scene_code":"0","field_code":"slfdf_2503170004","reason_id":"8815788586036214869","reason_name":"定位不准确","location_add":"吉林省吉林市昌邑区解放北路大润发(解放北路店)","location_lat":"43.869328","location_lon":"126.580405","sign_distance":193,"store_distance":98,"offset_distance":"当前位置距离签到位置偏差193米,距离门店位置偏差98米","image_path":["user_defined/6127943778677458155/202504/15980FB2-9F54-47A5-9C76-A62023714A65.jpg","user_defined/6127943778677458155/202504/D9233360-8766-4CA7-A2D1-587BF18FEBC7.jpg","user_defined/6127943778677458155/202504/263C981F-FD4D-492E-9189-8D9B3759D11A.jpg","user_defined/6127943778677458155/202504/18ACA298-717B-4AF4-9AAE-D51027C4E3C9.jpg","user_defined/6127943778677458155/202504/2A5EB22A-160B-4EC6-8EDA-C0870FD1BD6E.jpg","user_defined/6127943778677458155/202504/96397D2F-9EA6-4317-87AB-C799F0723570.jpg","user_defined/6127943778677458155/202504/D15AD384-FE5E-40E9-BF05-5113D4E91CCF.jpg","user_defined/6127943778677458155/202504/87E95DE1-DBAC-46DB-9B88-806639F7D220.jpg","user_defined/6127943778677458155/202504/677A21B7-5DE3-4C86-B43A-B783F2379F30.jpg","user_defined/6127943778677458155/202504/AF7973C1-88C9-4C42-B634-69635EA4A7DD.jpg","user_defined/6127943778677458155/202504/EC4EAC53-2DBB-4D61-AA23-B8A70FE48D51.jpg","user_defined/6127943778677458155/202504/2348A062-3F15-4473-9EA7-732D33978F8E.jpg","user_defined/6127943778677458155/202504/04DB8C0D-4B45-42D5-9FC0-F652F6C1A8E7.jpg"]} {"single":["user_defined/6127943778677458155/202504/20250401182938503_ec8392eb_clobotics.jpg","user_defined/6127943778677458155/202504/20250401182947199_ec8392eb_clobotics.jpg","user_defined/6127943778677458155/202504/20250401182955184_ec8392eb_clobotics.jpg","user_defined/6127943778677458155/202504/20250401183002203_ec8392eb_clobotics.jpg"],"scene_code":"0","image_path":["user_defined/6127943778677458155/202504/20250401182938503_ec8392eb_clobotics.jpg","user_defined/6127943778677458155/202504/20250401182947199_ec8392eb_clobotics.jpg","user_defined/6127943778677458155/202504/20250401182955184_ec8392eb_clobotics.jpg","user_defined/6127943778677458155/202504/20250401183002203_ec8392eb_clobotics.jpg"]} {"single":["user_defined/6127943778677458155/202504/20250401181308670_0cbe8c49_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181320801_0cbe8c49_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181343099_0cbe8c49_clobotics.jpg"],"scene_code":"0","image_path":["user_defined/6127943778677458155/202504/20250401181308670_0cbe8c49_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181320801_0cbe8c49_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181343099_0cbe8c49_clobotics.jpg"]} {"sign_distance":101,"image_path":["user_defined/6127943778677458155/202504/20250401180038429_643e07c4_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180111190_643e07c4_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180334248_643e07c4_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180344769_643e07c4_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181109651_643e07c4_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181124634_643e07c4_clobotics.jpg","user_defined/6127943778677458155/202504/20250401181246954_643e07c4_clobotics.jpg"],"jigsaw":{"pic_data":[{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401180038429_643e07c4_clobotics.jpg\":{\"lat\":22.223787307739258,\"lon\":113.5521469116211}}}","pic_path":["user_defined/6127943778677458155/202504/20250401180038429_643e07c4_clobotics.jpg"],"key":1743501639300},{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401180111190_643e07c4_clobotics.jpg\":{\"lat\":22.223684310913086,\"lon\":113.55232238769531}}}","pic_path":["user_defined/6127943778677458155/202504/20250401180111190_643e07c4_clobotics.jpg"],"key":1743501672066},{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401180334248_643e07c4_clobotics.jpg\":{\"lat\":22.223901748657227,\"lon\":113.55210876464844}}}","pic_path":["user_defined/6127943778677458155/202504/20250401180334248_643e07c4_clobotics.jpg"],"key":1743501815303},{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401180344769_643e07c4_clobotics.jpg\":{\"lat\":22.22368049621582,\"lon\":113.5523452758789}}}","pic_path":["user_defined/6127943778677458155/202504/20250401180344769_643e07c4_clobotics.jpg"],"key":1743501825657},{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401181109651_643e07c4_clobotics.jpg\":{\"lat\":22.223915100097656,\"lon\":113.5521011352539}}}","pic_path":["user_defined/6127943778677458155/202504/20250401181109651_643e07c4_clobotics.jpg"],"key":1743502270920},{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401181124634_643e07c4_clobotics.jpg\":{\"lat\":22.22376823425293,\"lon\":113.55223846435547}}}","pic_path":["user_defined/6127943778677458155/202504/20250401181124634_643e07c4_clobotics.jpg"],"key":1743502285456},{"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[]},\"latlons\":{\"20250401181246954_643e07c4_clobotics.jpg\":{\"lat\":22.223941802978516,\"lon\":113.5521469116211}}}","pic_path":["user_defined/6127943778677458155/202504/20250401181246954_643e07c4_clobotics.jpg"],"key":1743502367854}],"stitching_info_version":0},"field_code":"slfdf_2503170004","location_lon":"113.5521011352539","offset_distance":"当前位置距离签到位置偏差101米,距离门店位置偏差20米","scene_code":"0","reason_name":"系统定位功能有误","location_add":"广东省珠海市香洲区水湾路中国珠海出入境边防检查总站","store_distance":20,"location_lat":"22.223907470703125","reason_id":"8651040657141479820"} {"single":["user_defined/6127943778677458155/202504/ABA3F3E4-6909-445E-B83C-E182C4DE7A30.jpg","user_defined/6127943778677458155/202504/D0EF5BDC-8269-41E3-86F8-A761054A9FC7.jpg","user_defined/6127943778677458155/202504/CEEBCB0F-59A2-4B56-AA1E-27B00AA60B28.jpg","user_defined/6127943778677458155/202504/348B4A89-5855-4DD2-9598-299E8AAE35F3.jpg","user_defined/6127943778677458155/202504/C59F90B6-AFF3-4202-8E65-E92FCEE2AD1A.jpg","user_defined/6127943778677458155/202504/07BF28FF-6207-40C5-9DBF-EA1006F62EE0.jpg","user_defined/6127943778677458155/202504/0BDBAADD-2F7B-4652-A2DC-7A69EC7983D2.jpg"],"scene_code":"0","image_path":["user_defined/6127943778677458155/202504/ABA3F3E4-6909-445E-B83C-E182C4DE7A30.jpg","user_defined/6127943778677458155/202504/D0EF5BDC-8269-41E3-86F8-A761054A9FC7.jpg","user_defined/6127943778677458155/202504/CEEBCB0F-59A2-4B56-AA1E-27B00AA60B28.jpg","user_defined/6127943778677458155/202504/348B4A89-5855-4DD2-9598-299E8AAE35F3.jpg","user_defined/6127943778677458155/202504/C59F90B6-AFF3-4202-8E65-E92FCEE2AD1A.jpg","user_defined/6127943778677458155/202504/07BF28FF-6207-40C5-9DBF-EA1006F62EE0.jpg","user_defined/6127943778677458155/202504/0BDBAADD-2F7B-4652-A2DC-7A69EC7983D2.jpg"]} {"jigsaw":{"stitching_info_version":0,"pic_data":[{"key":1743501995115,"stitching_info":"{\"stitchingInfo\":{\"bestPov\":0,\"resize\":0.08333333333333333,\"retryHomo\":0,\"pair\":[{\"image1Index\":0,\"image2Index\":1,\"pixelCorrespondence\":[],\"homography\":[1.1684259,0.06631009,-81.005226,0.09746658,1.1377808,-17.466824,9.422482E-4,1.0183936E-4,1]}]},\"latlons\":{\"20250401180624494_19396c8e_clobotics.jpg\":{\"lat\":37.87641525268555,\"lon\":112.56110382080078},\"20250401180624498_19396c8e_clobotics.jpg\":{\"lat\":37.87641525268555,\"lon\":112.56110382080078}}}","pic_path":["user_defined/6127943778677458155/202504/20250401180624494_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180624498_19396c8e_clobotics.jpg"]}]},"scene_code":"0","field_code":"slfdf_2503170004","reason_id":"8815788586036214869","reason_name":"定位不准确","location_add":"山西省太原市杏花岭区东后小河御花园购物中心","location_lat":"37.87641525268555","location_lon":"112.56110382080078","sign_distance":53,"store_distance":34,"offset_distance":"当前位置距离签到位置偏差53米,距离门店位置偏差34米","image_path":["user_defined/6127943778677458155/202504/20250401180650575_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180713233_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180713236_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180624494_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180624498_19396c8e_clobotics.jpg"],"single":["user_defined/6127943778677458155/202504/20250401180650575_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180713233_19396c8e_clobotics.jpg","user_defined/6127943778677458155/202504/20250401180713236_19396c8e_clobotics.jpg"]} {"single":["user_defined/6127943778677458155/202504/F8157327-981E-4A98-A14F-2568703A1781.jpg","user_defined/6127943778677458155/202504/83ACB1A9-6B03-4B32-BE44-682534C58655.jpg","user_defined/6127943778677458155/202504/6CFDBB51-D114-4B77-9900-F7EC86ACC481.jpg","user_defined/6127943778677458155/202504/EA06D26D-7B43-4772-83EB-C29AAE15022F.jpg","user_defined/6127943778677458155/202504/75240E3E-8452-4808-9C47-0954DFF3B034.jpg","user_defined/6127943778677458155/202504/58A080F4-9161-4A56-BC6E-5F5529F11413.jpg","user_defined/6127943778677458155/202504/90E82A4E-B090-4FA0-A016-F9FC2A9D7BDE.jpg","user_defined/6127943778677458155/202504/B0DE300E-52D0-46C4-B220-4A9624E77252.jpg"],"image_path":["user_defined/6127943778677458155/202504/F8157327-981E-4A98-A14F-2568703A1781.jpg","user_defined/6127943778677458155/202504/83ACB1A9-6B03-4B32-BE44-682534C58655.jpg","user_defined/6127943778677458155/202504/6CFDBB51-D114-4B77-9900-F7EC86ACC481.jpg","user_defined/6127943778677458155/202504/EA06D26D-7B43-4772-83EB-C29AAE15022F.jpg","user_defined/6127943778677458155/202504/75240E3E-8452-4808-9C47-0954DFF3B034.jpg","user_defined/6127943778677458155/202504/58A080F4-9161-4A56-BC6E-5F5529F11413.jpg","user_defined/6127943778677458155/202504/90E82A4E-B090-4FA0-A016-F9FC2A9D7BDE.jpg","user_defined/6127943778677458155/202504/B0DE300E-52D0-46C4-B220-4A9624E77252.jpg"],"scene_code":"0"} 你看我现在输出的对象有 直接是 user_defined/4632566641780093882/202407/20240701200842588_42eb2a28_CAMERA_21001003269.jpg还有里面是一个对象的 {"single":["user_defined/6127943778677458155/202504/20250401172201779_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172314845_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172433004_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172454914_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172512816_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172522062_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172555750_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172833661_b9dae707_clobotics.jpg"],"scene_code":"0","field_code":"slfdf_2503170004","reason_id":"8815788586036214869","reason_name":"定位不准确","location_add":"辽宁省大连市沙河口区高尔基路凯德和平广场","location_lat":"38.89594650268555","location_lon":"121.58321380615234","sign_distance":254,"store_distance":35,"offset_distance":"当前位置距离签到位置偏差254米,距离门店位置偏差35米","image_path":["user_defined/6127943778677458155/202504/20250401172201779_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172314845_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172433004_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172454914_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172512816_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172522062_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172555750_b9dae707_clobotics.jpg","user_defined/6127943778677458155/202504/20250401172833661_b9dae707_clobotics.jpg"]} 现在我的代码如下for (FormField field : formDataList) { String fieldCode = field.getFieldCode(); String fieldValue = field.getFieldValue(); // 匹配规则2:字段编码匹配正则模式 if (fieldCode != null && fieldCode.matches(targetCodePattern)) { if (StringUtils.isNotBlank(fieldValue)){ if (fieldValue.contains(".jpg") || fieldValue.contains(".png")){ System.out.println("rrrrrrrrrrrrrrrrrrrrrrrr::::::"+fieldValue); imagePath = parseImagePath(fieldValue); break; } } } } // 如果找到图片路径,则放入结果映射 if (imagePath != null) { resultMap.put("image_path", imagePath); } resultArraryList.add(resultMap); 和 private String parseImagePath(String fieldValue) { // 这里假设fieldValue是一个JSON字符串,包含"image_path"字段 // 使用FastJSON解析 JSONObject jsonObject = JSON.parseObject(fieldValue); return jsonObject.getString("image_path"); } 现在的情况是如果 直接是user_defined/4632566641780093882/202407/20240701200842588_42eb2a28_CAMERA_21001003269.jpg这种的话,我的现在的方法会报错,帮我改一下
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值