2015-11-18 37 views
1

换行符我使用Scala的解析CSV文件分割CSV。其中一些文件的字段是非文本数据,如图像或八位字节流。我想使用Apache星火的textFile()方法将CSV分成行和星火:在八位字节流场

split(",[ ]*(?=([^\"]*\"[^\"]*\")*[^\"]*$)") 

到行分割为多个领域。不幸的是,这不适用于具有这些二进制字段的文件。有两个问题:1)八位字节流可以包含换行符,使得textFile()拆分行应该是1,2)八位字节流包含逗号和/或双引号,它们不会被转义并且混乱了我的模式。

的文件通常较大,几MB的高达几100Mbs的的。尽管我可以对它们进行预处理,但我必须尽可能采用CSV。

所有我想要实现的是一个分裂的工作函数,所以我可以忽略与八位字节流的领域。尽管如此,提取八位字节流中的文本信息将是一项巨大的好处。

那么我将如何去出面解决自己的问题?

编辑:用cat获得的典型记录,新行是从该文件,不用于美容目的(缩短):

7,url,user,02/24/2015 02:29:00 AM,03/22/2015 03:12:36 PM,octet-stream,27156,"MSCF^@^@^@^@�,^@^@^@^@^@^@D^@^@^@^@^@^@^@^C^A^A^@^C^@^D^@^@^@^@^@^T^@^@^@^@^@^P^@�,^@^@^X=^@^@^@^@^@^@^@^@^@^@�^@^@^@^E^@^A^@��^A^@^@^@^@^@^@^@WF6�!^@Info.txt^@=^B^@^@��^A^@^@^@WF7�^@^@List.xml^@^�^@^@��^A^@^@^@WF:�^@^@Filename.txt^@��>�� 
^@�CK�]�r��^Q��T�^O�^@�-�j�]��FI�Ky��Ei�Je^K""!�^Qx  @�*^U^?�^_�;��ħ�^LI^@$(�^Q���b��\N����t�����+������ȷgvM�^L̽�LǴL�^L��^ER��w^Ui^M��^X�Kޓ�^QJȧ��^N~��&�x�bB��D]1�^B|^G���g^SyG�����:����^_P�^T�^_�����U�|B�gH=��%Z^NY���,^U�^VI{��^S�^U�!�^Lpw�T���+�a�z�l������b����w^K��or��pH� ��ܞ�l��z�^\i=�z�:^C�^S!_ESCW��ESC""��g^NY2��s�� u���X^?�^R^R+��b^]^Ro�r���^AR�h�^D��^X^M�^]ޫ���ܰ�^]���0^?��^]�92^GhCx�DN^? 
mY<{��L^Zk�^\���M�^V^HE���-Ե�$f�f����^D�e�^R:�u����� ^E^A�Ȑ�^B�^E�sZ���Yo��8Eސ�}��&JY���^A9^P������^P����~Jʭy��`�^9«�""�U�  �:�}3���6�Hߧ�v���A7^Xi^L^]�sA�^Q�7�5d�^Xo˛�tY 
Bp��4�Y���7DkV_���\^_q~�w�|�a�s̆���#�g�ӳu�^�!W}�n��Rgż_2�]�p�2}��b�G9�M^Q 
�����:�X����bR[ԳZV!^G����^U�tq�&�Y6b��GR���s#mn6Z=^ZH^]�b��R^G�C�0R��{r1��4�#� 
=r/X2�^O�����r^M�Rȕ�goG^X-����}���P+˥Qf�#��^C�Բ�z1�I�j����6�^Np���ܯ^P�[�^Tzԏ���^F2�e��\�E�߻6c�%���$�:E�*�*©t�y�J�,�S�2U�S�^X}ME�]��]�i��G�su�""��!�-��!r'ܷe_et Y^K^?0���l^A��^^�m�1/q����|�_r�5$�%�([x��W^E�G^^y���@����Z2^?ڠ�^_��^AҶ�OO��^]�vq%:j�^?�jX��\�]����^S�^^n�^C��>.^CY^O-� �_�\K����:p�<7Sֺnj���-Yk�r���^Q^M�n�J^B��^Z0^?�(^C��^W³!�g�Z�~R�A^M�^O^^�%;��Ԗ�p^S�w���*m^S���jڒ|�����<�^S�;Z^^Fc�1���^O�G_o����8��CS���w��^?��n�2~��m���G;��rx4�(�]�'��^E���eƧ�x��.�w�9WO�^^�י3��0,�y��H�Y�.H�x�""'���h}灢^T�Gm;^XE�̼�J��c�^^;�^A�qZ1ׁBZ^Q�^A^FB�^QbQ�_�3|ƺ�EvZ���^S�w���^P���9^MT��ǩY[+�+�9�Ԩ�^O�^Q���Fy(+�9p�^^Mj�2��Y^?��ڞ��^Ķb�^Z�ψMр}�ڣ�^^S�^?��^U�^Wڻ����z�^@��uk��k^^�>^O�^W�ݤO�h�^G�����Kˇ�.�R|�)-��e^G�^]�/J����U�ϴ�a���i5HO�^L�ESCg�R'���.����d���+~�}��ڝ^Y5]l�3jg54M�������2t�5^Y}�q)��^O;�X\�q^Ox~Vۗ�t�^\f�  >k;^G�K5��,��X�t/�ǧ^G""5��4^MiΟ�n��^B^]�|�����V��ߌ֗Q~�H���8��t��5��ܗ� 
�Z�^c�6N�ESCG����^_��>��t^L^R�^:�x���^]v�{^@+KM��qԎ�.^S�%&��=^W-�=�^S�����^CI���&^]_�s�˞�y�z�Jc^W�kڠ�^\��^]j�����^O��;�oY^^�^V59;�c��^B��T�nb����^C��^N��s�x�<{�9-�F�T�^N�5�^Se-���^T�Y[���`^ZsL��v�բ<C�+�~�^ۚ��""�Yκ2^_�^VxT�>��/ݳ^U�m�^@���3^Ge�n^Vc�V�^@�NVn�,�q��^^^]gy�R�S��Ȃ$���>A�d����xg�^GB3�M�J�^QJ^]�^\�{.�D��碎�^W�8a����qޠl?,'^R�^X�Cgy�P[����mڞ��H�Z�s�SD&蠤�s�E��nu�[email protected]<��3wj`C-%w�W�J�^WP^T�^]r^NT�TC�Lq�Z�f�!�;�l�Y��Gb��>�ud�hx�Ԭ^N)9�^N!k�҉s�35v������.�""^]��~4������۴�Z^]u�^Ti^^�i:�)K��P᳕!�@�^?�>��EE^VE-u�^SgV^L��<��^D�O<�+�J.�c�Z#>�.l����^S� 
ESC��(��E�j�π쬖���2{^U&b\��P^S�`^O^XdL�^ 6bu��FD��^@^@^@^@","field_x, data",field_y,field_z 

预期输出将是一个数组

("7","url","user","02/24/2015 02:29:00 AM","03/22/2015 03:12:36 PM","octet-stream","27156","field_x, data",field_y",field_z") 

或者,但这可能是另一个问题,例如这样一个数组(如在octet-stream字段上运行strings):

("7","url","user","02/24/2015 02:29:00 AM","03/22/2015 03:12:36 PM","octet-stream","27156","Info.txt List.xml Filename.txt","field_x, data",field_y",field_z") 

编辑2:每个具有二进制字段的文件还包含一个长度字段。所以不是直接分割,我可以从左到右通过我的记录并提取字段。这当然是我目前情况的一大改进,但问题1)仍然存在。我怎样才能可靠地分割这些文件?

我接过仔细看看这些文件和头看起来像这样:

RecordId, Field_A, Content_Type, Content_Length, Content, Field_B 

(其中CONTENT_TYPE可以“八位字节流”,CONTENT_LENGTH在内容领域的字节数,和含量明显数据)。对我而言,Field_B的价值是可预测的,让我们假设某个文件总是“Hello World”。

因此,而不是使用对换行星火的默认行为分裂,我怎么能做到这一点星火仅在下面的“Hello World”的新行分割? (我也编辑问题标题,因为问题的焦点改变)

+0

您可以从提供示例数据和预期输出开始。一些细节,如单个文件的大小可能是有用的。如果你无法弄清楚当你有权访问数据时出现什么问题,我们怎么办? – zero323

+0

什么是“27156”?一段时间的流可能? – Nyavro

+0

是的。我可以从头读取整个文件,直到达到这个数字并读取下一个x字节作为八位字节流,但是我会放弃Spark提供的并行性。 – flowit

回答

0

如在Spark: Reading files using different delimiter than new line回答,我用textinputformat.record.delimiter拆分“Hello World \ n”,因为我有点幸运,最后一列总是包含相同的值。之后,我简单地从记录中左右移动,当我到达长度字段时,跳过下一个n字节。现在一切正常。感谢您指点我正确的方向。