在 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 文件的第一行 的相关文章

  • NumPy genfromtxt:正确使用filling_missing

    我正在尝试处理保存到 CSV 的数据 这些数据可能在未知数量的列 最多大约 30 列 中缺少值 我正在尝试使用将这些缺失值设置为 0 genfromtxt s filling missing争论 这是在 Win 7 上的 ActiveSta
  • 将 CSV 导入 Excel - 自动“文本到列”和“插入表格”

    我想在 Excel 2010 上打开 CSV 逗号分隔 文件并自动将文本转换为列 然后选择所有活动单元格并插入带标题的表格 是否可以在我的功能区中添加一个按钮来为我完成这一切 我经常使用不同大小的 CSV 文件 我发现每次手动执行此操作有点
  • 在 Bash 中拆分 csv 文件中的列

    我想从 csv 文件的第二列中提取值并将提取的值存储在新列中 我的数据集示例 page name post id page id A 86680728811 272953252761568 86680728811 A 86680728811
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter
  • 降低计算精度以加快执行速度

    我有一个数据采集系统 可以进行几分钟的测量并生成一个包含 1000 万行和 10 列的 csv 文件 然后我在Python csv reader 中导入这个csv文件 对获取的数值数据执行一系列操作 但一次 只能 10000行 否则计算机内
  • 计算列表中每个项目在 pandas 数据框列中出现的次数,并用逗号分隔值

    我有一个清单 citylist New York San Francisco Los Angeles Chicago Miami 和带有这些值的 pandas Dataframe df1 first last city email John
  • Pandas Dataframe.to_csv 小数=',' 不起作用

    在 Python 中 我正在将 Pandas Dataframe 写入 csv 文件 并希望将小数分隔符更改为逗号 像这样 results to csv D Data Kaeashi BigData ProcessMining Voorbe
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • 二维列表转 csv - 按列

    我想将 2D 列表的内容导出到 csv 文件中 子列表的大小可以不同 例如 二维列表可以是这样的 a a b c d e f g h i 我希望我的 csv 存储这样的数据 按列 a e g h b f i c d 我是否必须添加一些空格才
  • 如何在 Windows Phone 8 应用程序中读写 xls、docs 和 csv 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么不起作用以及预期结果 也可以看看 Stack Overfl
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • BigQuery:从 CSV 加载,跳过列

    假设我有一个包含现有数据的表 其架构如下 name Field1 type STRING name Field2 type STRING 我们的数据是 CSV Field1 Field2 Value1 Value2 我们通过创建新作业来加载
  • Python + Pandas + dataframe:无法将一个数据帧附加到另一个数据帧

    我有两个大的 CSV 文件 我已将它们转换为 Pandas 数据框 它们都有相同名称和相同顺序的列 event name category category id description 我想将一个数据帧附加到另一个数据帧 最后想将生成的数
  • 将 CSV 文件导入二维字符串数组

    我必须将文本文件读入二维数组 我遇到的唯一问题是数组的宽度各不相同 最大大小为 9 列 我不知道会有多少行 例如 有些行有 6 列 有些行有 9 列 这是我的 CSV 文件的一小部分 1908 Souths Easts Souths Cum
  • 编辑 CSV 文件(设计实现)

    我开始设计一个程序 该程序将根据已找到并保存到主 CSV Excel 文件中的相似字符串及其标识 自动执行正确查找和识别字符串的过程 现在我想正确设计它 这样我以后在实现 CSV Excel 读写部分时就不会遇到问题 我可能会使用 Open
  • 从逗号分隔的字符串中删除项目[重复]

    这个问题在这里已经有答案了 假设我有一个字符串 cat mouse dog horse 是否有正则表达式或函数可以按如下方式工作 1 cat return string gt mouse dog horse 2 mouse return s
  • Spark SQL如何读取压缩的csv文件?

    我尝试过使用apispark read csv读取带有扩展名的压缩 csv 文件bz or gzip 有效 但在源代码中我没有找到任何可以声明的选项参数codec type 即使在这个link https github com databr
  • PIG:从分组包中取出所有元组

    我使用 PIG 从元组生成组 如下所示 a1 b1 a1 b2 a1 b3 gt a1 b1 b2 b3 这很容易并且有效 但我的问题是得到以下内容 从获得的组中 我想生成组包中所有元组的集合 a1 b1 b2 b3 gt b1 b2 b1
  • CSV 解析 - Swift 4

    我正在尝试解析 CSV 但遇到一些问题 下面是我用来解析 CSV 的代码 let fileURL Bundle main url forResource test application data Sheet 1 withExtension
  • 使用 silverlight 4 和 c# 创建 CSV 下载

    我正在努力寻找示例或代码 以便能够在 silverlight 中创建 CSV 或文本文件作为可下载链接 我已经在 ASP net 中完成了此操作 但无法找到使用 Silverlight 的方法 我在旋转轮子吗 或者我应该创建一个 ASP 页

随机推荐

  • 如何通过 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