在 Pig 中提取 CSV 文件的第一行

2023-12-12

我有几个 CSV 文件,标题始终是文件中的第一行。在 Pig 中将该行作为字符串从 CSV 文件中取出的最佳方法是什么?不能使用 sed、awk 等进行预处理。

我尝试使用常规 PigStorage 和 Piggybank CsvLoader 加载文件,但我不清楚如何获取第一行(如果有的话)。

如果需要的话,我愿意编写 UDF。


免责声明:我不太擅长 Java。

您将需要一个 UDF。我不确定您到底想要什么,但这个 UDF 将获取一系列 CSV 文件并将它们转换为地图,其中键是文件顶部的值。希望这已经足够了,以便您可以将其更改为您想要的内容。

我在远程和本地完成的几个测试表明这是可行的。

package myudfs;
import java.io.IOException;
import org.apache.pig.LoadFunc;

import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

import org.apache.pig.PigException;
import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigSplit;

public class ExampleCSVLoader extends LoadFunc {
    protected RecordReader in = null;
    private String fieldDel = "" + '\t';
    private Map<String, String> outputMap = null;
    private TupleFactory mTupleFactory = TupleFactory.getInstance();

    // This stores the fields that are defined in the first line of the file
    private ArrayList<Object> topfields = null;

    public ExampleCSVLoader() {}

    public ExampleCSVLoader(String delimiter) {
        this();
        this.fieldDel = delimiter;
    }

    @Override
    public Tuple getNext() throws IOException {
        try {
            boolean notDone = in.nextKeyValue();
            if (!notDone) {
                outputMap = null;
                topfields = null;
                return null;
            }

            String value = in.getCurrentValue().toString();
            String[] values = value.split(fieldDel);
            Tuple t =  mTupleFactory.newTuple(1);

            ArrayList<Object> tf = new ArrayList<Object>();

            int pos = 0;
            for (int i = 0; i < values.length; i++) {
                if (topfields == null) {
                    tf.add(values[i]);
                } else {
                    readField(values[i], pos);
                    pos = pos + 1;
                }
            }
            if (topfields == null) {
                topfields = tf;
                t = mTupleFactory.newTuple();
            } else {
                t.set(0, outputMap);
            }

            outputMap = null;
            return t;
        } catch (InterruptedException e) {
            int errCode = 6018;
            String errMsg = "Error while reading input";
            throw new ExecException(errMsg, errCode,
                    PigException.REMOTE_ENVIRONMENT, e);
        }

    }

    // Applies foo to the appropriate value in topfields
    private void readField(String foo, int pos) {
        if (outputMap == null) {
            outputMap = new HashMap<String, String>();
        }
        outputMap.put((String) topfields.get(pos), foo);
    }

    @Override
    public InputFormat getInputFormat() {
        return new TextInputFormat();
    }

    @Override
    public void prepareToRead(RecordReader reader, PigSplit split) {
        in = reader;
    }

    @Override
    public void setLocation(String location, Job job)
            throws IOException {
        FileInputFormat.setInputPaths(job, location);
    }
}

使用以下命令加载目录的示例输出:

csv1.in             csv2.in
-------            ---------
A|B|C               D|E|F
Hello|This|is       PLEASE|WORK|FOO
FOO|BAR|BING        OR|EVERYTHING|WILL
BANG|BOSH           BE|FOR|NAUGHT

产生以下输出:

A: {M: map[]}
()
([D#PLEASE,E#WORK,F#FOO])
([D#OR,E#EVERYTHING,F#WILL])
([D#BE,E#FOR,F#NAUGHT])
()
([A#Hello,B#This,C#is])
([A#FOO,B#BAR,C#BING])
([A#BANG,B#BOSH])

The ()s 是文件的顶行。getNext()要求我们返回一些东西,否则文件将停止处理。因此它们返回一个空模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pig 中提取 CSV 文件的第一行 的相关文章

  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • 将 CSV 文件导入 MySQL 数据库时出现无效的 UTF-8 字符串

    我正在尝试使用以下代码将 CSV 导入我的 MySQL 数据库 我从帖子中获取了 CSV 文件
  • 将文本文件转换为逗号分隔的字符串

    我似乎没有找到与这个问题完全匹配的问题 我有一个文本文件 每行有一个文本标记 没有任何逗号 制表符或引号 我想根据文件内容创建一个逗号分隔的字符串 Input one two three Output one two three 我正在使用
  • 保存的数据带有不需要的引号

    我使用以下代码将数据框导出到 csv data write format com databricks spark csv options delimiter t codec org apache hadoop io compress Gz
  • 将 CSV 文件上传到 SQL 服务器

    上传大文件的最佳方式是什么csv使用 C 将数据文件导入 SQL Server 该文件包含大约 30 000 行和 25 列 首先 你不需要编程的东西 您可以使用 SQL 管理工具直接将 CSV 文件上传到 SQL 数据库 但是 如果您确实
  • 在闪亮的应用程序中选择文件夹或文件夹目录

    我在使用闪亮时遇到问题 我想选择保存我要在应用程序中使用的所有文件的文件夹 方法是 1 将工作目录设置为该文件夹路径 或 2 将此文件夹内的所有 csv 数据上传到我的应用程序以进行进一步处理 1 我找到了shinyFiles包 但它非常非
  • 如何在byte[]中制作csv?

    我想知道我应该如何创建一个在 byte 中创建 csv 文件的方法 目前我正在使用这样的东西 public byte makeCsv StringBuffer csv new StringBuffer csv append columnhe
  • 如何在flutter中从设备存储读取CSV文件

    我想将数据从 flutter 中的 CSV 文件导入到 firebase 数据库中 因此 我使用文件选择器从设备中选择 CSV 文件 现在我如何从该文件中读取数据 首先从 dart 包导入 file picker 和 CSV 包 比定义方法
  • python csv按列转换为字典

    是否可以将 csv 文件中的数据读取到字典中 使得列的第一行是键 同一列的其余行构成列表的值 例如 我有一个 csv 文件 strings numbers colors string1 1 blue string2 2 red string
  • CSV、Python:正确使用 DictWriter(ValueError:dict 包含不在字段名中的字段)

    我在掌握 csv 模块 Python 2 7 中的 DictWriter 时遇到困难 我有这个 哦 我正在使用 unicodecsv 库 因为我读到存在问题 f object instance return a dictionary key
  • 可以写入 csv 文件但不能追加

    string pathDesktop Environment GetFolderPath Environment SpecialFolder Desktop string filePath pathDesktop mycsvfile csv
  • 对 CSV 行使用小写函数

    我正在尝试以小写形式打印 csv 中的所有数据 但我没有任何运气 这是我到目前为止所拥有的 import csv books csv reader open books csv rb for row in books print row 这
  • 在powershell的列中处理带有换行符的CSV

    目前 我有一个系统 它创建一个像下面这样的分隔文件 在其中我模拟了偶尔出现在列中的额外换行符 列 1 列 2 列 3 列 4 文本1 文本2 LF 文本3 LF 文本4 CR LF 文本1 文本2 LF LF 文本3 文本4 CR LF 文
  • 为什么 pandas.to_datetime 对于非标准时间格式(例如“2014/12/31”)很慢

    我有一个这种格式的 csv 文件 timestmp p 2014 12 31 00 31 01 9200 0 7 2014 12 31 00 31 12 1700 1 9 当通过阅读时pd read csv并将时间字符串转换为日期时间使用p
  • 使用 pandas 将字符串对象转换为 int/float

    import pandas as pd path1 home supertramp Desktop 100 life 180 data csv mydf pd read csv path1 numcigar Never 0 1 5 Ciga
  • Import-Csv - 成员已存在问题

    我必须将多个 CSV 文件合并为一个文件 每个 CSV 都有一个标题 其中一列标题是相同的 理想情况下 最终文件 all out csv 必须有一个标头 我运行 PowerShell 代码 Import Csv out 1 result c
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

    我正在尝试使用 R 中的 readr read csv 读取 csv 文件 我导入的 csv 文件大约有 150 列 我只包含示例的前几列 我希望将第二列从默认类型 我执行 read csv 时为日期 覆盖为字符或其他日期格式 GIS Jo
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • Python-将标题写入csv

    目前我正在用 python 编写查询 将数据从 oracle dbo 导出到 csv 文件 我不知道如何在文件中写入标题 try connection cx Oracle connect user pass tns name cursor

随机推荐

  • 如何通过 Ecto Multi 从先前插入的表键中检索 id

    我想从之前由 Ecto Multi 插入的表主键中检索 id 首先 我插入到A主表中 那么B明细表需要A id 我尝试了以下代码 Multi new gt Multi insert insert main gt Multi insert a
  • 如何发送 HTML/CSS 电子邮件?

    大多数电子邮件客户端在读取 HTML 电子邮件 包括 Gmail 和 Hotmail 中的 CSS 时遇到问题 我经常使用此服务将 HTML CSS 转换为正确的电子邮件格式 以便用户端的一切看起来都正常 基本上它的作用是将所有 CSS 转
  • 在 JavaScript 中调用 MATLAB

    我是 JavaScript 新手 正在使用 JavaScript 编写一个简单的网页游戏来进行研究 人们可以玩游戏并收集一些数据 收集到的数据需要经过MATLAB处理 并将结果返回给JavaScript代码 JavaScript 代码将在客
  • std::promise::set_value() 和 std::future::wait() 是否提供内存栅栏?

    如果我执行以下操作 std promise
  • 函数中的 SELECT 或 INSERT 是否容易出现竞争条件?

    我编写了一个函数来为简单的博客引擎创建帖子 CREATE FUNCTION CreatePost VARCHAR TEXT VARCHAR RETURNS INTEGER AS DECLARE InsertedPostId INTEGER
  • javascript匿名函数[重复]

    这个问题在这里已经有答案了 可能的重复 这个 JavaScript 片段是什么意思 我想知道为什么函数末尾有双括号 这是匿名函数的简单说明 function 功能 那些是做什么用的 这声明了一个匿名函数并在同一行立即调用它 将其视为 foo
  • 为单个图像创建多个蒙版

    我正在尝试创建以下场景 并且我愿意使用 jquery css 和 html 的任意组合 不过我现在想远离 HTML 5 但我愿意看看它如果这是唯一的解决方案 我想要一张大图像 只能在蒙版所在的位置可见 我尝试了多种技术 但都不起作用 任何建
  • 解析输出并计算字符串出现的次数[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在运行一些代码 由于复杂性和篇幅 我想也许可以使用一些代码来让我的生活变得轻松 所以代码运行时使用 gt commandA output results are popping
  • Jenkins:凭证中私钥的正确格式是什么

    我正在 Windows Server 2016 上运行的 Jenkins 2 152 中创建一个作业 该作业需要从 bitbucket org 上托管的 git 存储库中提取 我通过 git bash 测试了 ssh 密钥 所以我知道它有效
  • 将 C# winforms 按钮处理为击键?

    I want to make a button on that when pressed the key combination Ctrl is pressed and another where Ctrl is pressed How c
  • 有没有办法让 Behat 不会因 PHP 通知错误而失败?

    我知道最好的做法是定义所有变量并在评估之前检查数组索引 但是 我正在尝试对在一些尚未以这种方式编码的遗留代码之上开发的新功能运行一些测试 Behat 失败并显示以下消息 Scenario Add a new resource feature
  • var fn = function() {...} 和 var fn = function foo() {...} 有不同吗?

    当您将函数分配给变量时 如果使用命名函数而不是匿名函数 这有什么区别吗 以下生成错误 foo 未定义 var fn function foo foo 谁能澄清这里发生了什么事吗 你正在创建一个命名函数表达式 IE 中除外 该名称仅在函数内部
  • JSP - 在 JSP 页面之间传递参数

    如何使用纯 Java 代码在 JSP 页面之间传递参数 IE 我不想使用如下代码
  • 如何在Polars中按数据类型选择列?

    在 pandas 中我们有pandas DataFrame select dtypes根据选择某些列的方法dtype 在 Polars 中是否有类似的方法来做这样的事情 可以将数据类型传递给pl col import polars as p
  • 如何多行匹配两个字符串之间的所有文本

    我正在努力完成与所见相同的事情here 即假设您有如下文本 p something p p class sdf some text p p some other text p p The end p 匹配的正则表达式是什么 p class
  • 如何将 NodeJS 与 Angular 连接(在 Nginx 中)

    我有一个带有 Angular 和 NodeJS 的存储库 我在詹金斯中表现 install globally npm install g bower npm install g gulp install bower install npm
  • 如何在 VB 6 中获取当前 CPU 和 RAM 使用情况?

    如何获取VB 6代码中的CPU和内存使用情况 谢谢 确定当前机器上的CPU使用率
  • 从文本文件读取数据并创建对象

    我需要一些帮助 我正在 Java 上进行超市模拟 但我遇到了一个问题 我有一个文本文件 Stock txt 其中包含超市的所有库存 例如 0 面包店 巧克力蛋糕 12 5 250 1 肉 优质牛排 2 6 120 2 海鲜 金枪鱼 1 2
  • Java两次之间的差异[重复]

    这个问题在这里已经有答案了 可能的重复 计算两个 Java 日期实例之间的差异 时间 1 17 05 时间 2 17 08 我想在几秒钟内得到差异 long diffInMillis newerDate getTime olderDate
  • 在 Pig 中提取 CSV 文件的第一行

    我有几个 CSV 文件 标题始终是文件中的第一行 在 Pig 中将该行作为字符串从 CSV 文件中取出的最佳方法是什么 不能使用 sed awk 等进行预处理 我尝试使用常规 PigStorage 和 Piggybank CsvLoader