首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入和读取具有二进制格式的对象

写入和读取具有二进制格式的对象
EN

Stack Overflow用户
提问于 2018-09-14 08:17:02
回答 1查看 64关注 0票数 2

因此,我目前正在尝试创建两个U脚本--其中一个是将特定对象写入文件的脚本,另一个是读取文件并获取对象的脚本。

编写U脚本:

代码语言:javascript
运行
复制
@bloomTest =
    EXTRACT date DateTime,
            region string,
            tenantName string,
            fileName string,
            modifyingUsers string,
            firstAccess string,
            lastAccess string
    FROM "SearchLog.tsv"
    USING Extractors.Tsv();

@rs0 =
    SELECT sqlProjsend.Send.send(region) AS Obj
    FROM @bloomTest;


OUTPUT @rs0
TO "/output/bloomtestSend.csv"
USING Outputters.Csv();

编写代码-隐藏:

代码语言:javascript
运行
复制
 public static class Send
    {

        public static string send(string s)
        {
            IBloomfilter bloom = new BloomFilter(52);

            bloom.Add("hello");

            byte[] bArr = Serialize(bloom);
            return "|" + BitConverter.ToString(bArr).Replace("-", "") + "|";
        }




        static byte[] Serialize(IBloomfilter bloom)
        {
            MemoryStream stream = new MemoryStream();
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, bloom);
            return stream.ToArray();
        }
    }

接收脚本:

代码语言:javascript
运行
复制
@bloomTest =
    EXTRACT bloom string

    FROM "/output/bloomtestSend.csv"
    USING Extractors.Csv();

@rs0 =
    SELECT sqlProjrecv.Recieve.recv(bloom) AS bloomRes
    FROM @bloomTest;


OUTPUT @rs0
TO "/output/bloomtestRecv.csv"
USING Outputters.Csv();

接收代码-隐藏:

代码语言:javascript
运行
复制
public static class Recieve
    {   
        public static string recv(string b)
        {

            string[] ss = b.Split('|');

            IBloomfilter bloom = Deserialize(StringToByteArray(ss[1]));

            string[] strings = new string[3];
            strings[0] = "nice";
            strings[1] = "world";
            strings[2] = "hello";

            string retVal = "";
            foreach(string s in strings)
            {

            }
            return retVal;
        }

        public static byte[] StringToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
        private static IBloomfilter Deserialize(byte[] param)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(param, 0, param.Length);
                IFormatter br = new BinaryFormatter();
                ms.Position = 0;
                return br.Deserialize(ms) as BloomFilter;
            }
        }
    }

当我试图运行接收本地程序时,我一直遇到的错误是could not find collection __codeBehind_g4nuvpoe.vvy,它并没有告诉我太多。我试图发送的bloomfilter对象确实有效。我还尝试在另一个项目中使用完全相同的代码,而不使用完全工作的use脚本:

代码语言:javascript
运行
复制
class Program
    {
        public static byte[] StringToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
        private static IBloomfilter Deserialize(byte[] param)
        {
            using (MemoryStream ms = new MemoryStream(param))
            {
                IFormatter br = new BinaryFormatter();
                return br.Deserialize(ms) as BloomFilter;
            }
        }

        static byte[] Serialize(IBloomfilter bloom)
        {
            MemoryStream stream = new MemoryStream();
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, bloom);
            return stream.ToArray();
        }


        static void Main(string[] args)
        {

            IBloomfilter bloom = new BloomFilter(51);
            bloom.Add("hello");


            byte[] ser = Serialize(bloom);
            string bloomString = BitConverter.ToString(ser).Replace("-", "");


            ser = StringToByteArray(bloomString);

            bloom = Deserialize(ser);


            string[] k = new string[4];

            k[0] = "hello";
            k[1] = "world";
            k[2] = "not";
            k[3] = "this";

            foreach(string s in k)
            {
                if (bloom.Contains(s))
                {
                    Console.WriteLine(s);
                }

            }

            Console.ReadLine();
        }
     }

这些代码按照您的预期运行,您认为这些代码在功能上与u实现没有什么不同,那么实际的脚本有什么问题吗?

任何想法都会受到欢迎!

EN

回答 1

Stack Overflow用户

发布于 2018-10-01 10:08:51

我不认为你能用这种方法做到这一点。use代码将在“容器”上执行,除非您使用提取器和输出程序,否则您无法访问读取和写入文件。也许它在当地有效,但在Azure上就不行了。

您可以在这里获得自定义运算符的示例:

https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/data-lake-analytics/data-lake-analytics-u-sql-programmability-guide.md

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52327738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档